我有一个JSON文档列表,格式为:
[{a:1, b:[2,5,6]}, {a:2, b:[1,3,5]}, ...]
我需要做的是创建带有参数a
的节点,并将它们连接到列表b
中具有a
值的所有节点。所以第一个节点将连接到节点2,5和6.现在我正在使用Python的neo4jrestclient来填充,但这需要很长时间。是否有更快的填充方式?
目前这是我的剧本:
break_list = []
for each in ans[1:]:
ref = each[0]
q = """MATCH n WHERE n.url = '%s' RETURN n;""" %(ref)
n1 = gdb.query(q, returns=client.Node)[0][0]
for link in each[6]:
if len(link)>4:
text,link = link.split('!__!')
q2 = """MATCH n WHERE n.url = '%s' RETURN n;""" %(link)
try:
n2 = gdb.query(q2, returns=client.Node)
n1.relationships.create("Links", n2[0][0], anchor_text=text)
except:
break_list.append((ref,link))
答案 0 :(得分:1)
您可能需要考虑将您的JSON转换为CSV(使用类似jq之类的内容),然后您可以使用LOAD CSV
Cypher工具进行导入。 LOAD CSV
针对数据导入进行了优化,因此使用此方法可以获得更好的性能。在您的示例中,LOAD CSV
脚本看起来像这样:
您的JSON已转换为CSV:
"a","b"
"1","2,5,6"
"2","1,3,5"
首先创建唯一性约束/索引。这将确保只为任何“名称”创建一个节点,并创建索引以提高查找性能。
CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE;
鉴于上述CSV文件,此Cypher脚本可用于有效导入数据:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///path/to/file.csv" AS row
MERGE (a:Person{name: row.a})
WITH a,row
UNWIND split(row.b,',') AS other
MERGE (b:Person {name:other})
CREATE UNIQUE (a)-[:CONNECTED_TO]->(b);
其他选项
另一种选择是使用JSON作为Cypher查询中的参数,然后使用UNWIND
迭代JSON数组的每个元素。
WITH {d} AS json
UNWIND json AS doc
MERGE (a:Person{name: doc.a})
WITH doc, a
UNWIND doc.b AS other
MERGE (b:Person{name:other})
CREATE UNIQUE (a)-[:CONNECTED_TO]->(b);