从列表中批量写入 py2neo

bulk write in py2neo from a list

我有以下数据,表示两个物体之间的距离。

data = [[('123','234'), 10],
        [('134','432'), 12],

       ]

我想通过 py2neo v3 将其插入到 neo4j 中:

for e, p in enumerate(data):
    #
    id_left  = p[0][0]
    id_right = p[0][1]    
    distance = p[1]
    #
    left  = Node("_id", id_left)
    right = Node("_id", id_right)
    G.merge(left)
    G.merge(right)
    r = Relationship(left,'TO', right, distance=distance)
    G.create(r)
    #

但我发现这非常非常慢。加快速度的最好方法是什么?我环顾四周,但没有找到任何代码示例可以清楚地说明如何去做

显然您错误地使用了 py2neo 来创建节点,您当前的代码产生了以下内容:

如您所见,您给 Node 对象的第一个参数是标签,第二个参数应该是属性映射。

这很慢,因为 MERGE 没有可匹配的东西。

这是您的代码的更正版本,它将使用标签 MyNode 和 属性 id :

from py2neo import Graph, Node, Relationship
graph = Graph(password="password")

data = [

    [('123','234'), 10],
    [('134','432'), 12],
]


for e, p in enumerate(data):
    #
    id_left  = p[0][0]
    id_right = p[0][1]    
    distance = p[1]
    #
    left  = Node("MyNode", id=id_left)
    right = Node("MyNode", id=id_right)
    graph.merge(left)
    graph.merge(right)
    r = Relationship(left,'TO', right, distance=distance)
    graph.create(r)

这将产生下图:

当您开始拥有数千个 MyNode 节点时,对于大多数性能,您可以在 id 属性 上添加唯一约束:

CREATE CONSTRAINT ON (m:MyNode) ASSERT m.id IS UNIQUE;

现在这段代码对 Neo4j 进行了 3 次调用,性能最高的是直接使用 cypher :

data = [

    [('123','234'), 10],
    [('134','432'), 12],
]


params = []
for x in data:
    params.append({"left": x[0][0], "right": x[0][1], "distance": x[1] })


q = """
UNWIND {datas} AS data
MERGE (m:MyNode {id: data.left })
MERGE (m2:MyNode {id: data.right })
MERGE (m)-[r:TO]->(m2)
SET r.distance = data.distance
"""

graph.run(q, { "datas": params })

这将产生与上面相同的图表。