【发布时间】:2019-04-15 03:24:55
【问题描述】:
目前我正在努力寻找一种高性能的方式,使用 py2neo 运行多个查询。我的问题是在 python 中有大量写入查询需要写入 neo4j。
我现在尝试了多种方法来解决这个问题。对我来说最好的工作方法是以下一种:
from py2neo import Graph
queries = ["create (n) return id(n)","create (n) return id(n)",...] ## list of queries
g = Graph()
t = graph.begin(autocommit=False)
for idx, q in enumerate(queries):
t.run(q)
if idx % 100 == 0:
t.commit()
t = graph.begin(autocommit=False)
t.commit()
编写查询仍然需要很长时间。我也尝试了从 apoc 运行许多但没有成功,查询从未完成。我还尝试了使用自动提交的相同写作方法。有一个更好的方法吗?有没有先删除索引,插入数据后再添加的技巧?
-- 编辑:附加信息:
我正在使用 Neo4j 3.4、Py2neo v4 和 Python 3.7
【问题讨论】:
-
你创造了很多相同的东西吗?即
CREATE (n:Person {name: 'Joe'}) RETURN id(n)* 1000 个不同的人?如果您不使用索引来创建,您以后需要它们进行查询吗?如果是这样,不妨把它们留在里面,如果不是,那么你甚至需要它们吗?您是否从头开始初始化图表,如果是,可能有一些其他工具可以更快地启动它。 -
我向 neo4j 类型发送了大量查询,包括为节点创建、合并和为关系创建。查询可能有很大不同。我需要稍后查询的索引。不,不幸的是我没有从头开始构建图表。
-
公平——什么版本的py2neo?更具体地说,您是使用螺栓连接(从 v4 开始可用/默认)还是 http?您是使用 id(n) 返回还是它们只是用于调试/等?你能跟踪所有查询的运行时间,看看是否有任何特别慢的吗?抱歉所有问题,查询调整大量查询是一件复杂的事情:)
-
哦,是的,对不起,我忘了。我正在使用 py2neo v4 和来自 docker hub 的最新版本的 neo4j。没有返回,这个查询我给了一个基本的占位符,但我只是写查询,我不关心返回。我跟踪了运行时间——其中一个查询很慢,特别是它只是发送了太多导致问题的查询。
-
听起来不错——见下面@InverseFalcon 的回答。要创建许多类似的东西,请使用 UNWIND + 查询参数:
UNWIND $list AS item MERGE (n:Node {foo: item.bar})并使用参数列表调用它,其中包含要创建的每个节点的道具。并确保您使用的是螺栓连接,而不是 http。
标签: python neo4j graph-databases py2neo