ele*_*ias 2 neo4j cypher py2neo
我有以下数据,表示两个对象之间的距离.
data = [[('123','234'), 10],
[('134','432'), 12],
]
Run Code Online (Sandbox Code Playgroud)
我想通过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)
#
Run Code Online (Sandbox Code Playgroud)
但我发现这非常非常慢.加速这项工作的最佳方法是什么?我环顾四周,但没有找到任何代码示例,清楚地说明了如何去做
Chr*_*sen 13
显然您使用错误的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)
Run Code Online (Sandbox Code Playgroud)
这将产生以下图表:
对于大多数性能,当您开始拥有数千个MyNode
节点时,可以在id
属性上添加唯一约束:
CREATE CONSTRAINT ON (m:MyNode) ASSERT m.id IS UNIQUE;
Run Code Online (Sandbox Code Playgroud)
现在这段代码正在对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 })
Run Code Online (Sandbox Code Playgroud)
这将导致与上面相同的图形.