【问题标题】:Query writing performance on neo4j with py2neo使用 py2neo 在 neo4j 上查询写入性能
【发布时间】: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


【解决方案1】:

您可能需要阅读 Michael Hunger 的 tips and tricks for fast batched updates。

关键技巧是使用UNWIND将列表元素转换为行,然后逐行执行后续操作。

有一些支持功能可以轻松为您创建列表,例如range()。

例如,如果你想创建 10k 个节点并添加一个 name 属性,然后返回节点名称及其图形 id,你可以这样做:

UNWIND range(1, 10000) as index
CREATE (n:Node {name:'Node ' + index})
RETURN n.name as name, id(n) as id

同样,如果您有大量数据要导入,您可以创建一个参数映射列表,调用查询,然后展开列表以立即对每个条目进行操作,类似于我们使用 LOAD CSV 处理 CSV 文件的方式.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多