我有一个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))发布于 2015-12-07 21:16:20
您可能需要考虑将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);其他选项
另一个选项是在Cypher查询中使用JSON作为参数,然后使用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); 尽管非常大的JSON数组可能存在一些性能问题。请参阅此这里和这里的一些示例。
https://stackoverflow.com/questions/34118491
复制相似问题