从列表中批量写入 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 })
这将产生与上面相同的图表。
我有以下数据,表示两个物体之间的距离。
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 })
这将产生与上面相同的图表。