导入Neo4j的最快方法是什么?

时间:2015-12-06 14:29:02

标签: python neo4j

我有一个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))

1 个答案:

答案 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); 

尽管对于非常大的JSON数组可能存在一些性能问题。请参阅此herehere的一些示例。