【问题标题】:Fastest way to perform bulk add/insert in Neo4j with Python?使用 Python 在 Neo4j 中执行批量添加/插入的最快方法?
【发布时间】:2012-09-28 16:15:37
【问题描述】:

我发现 Neo4j 在通过 py2neo for Python 使用 REST API 时添加节点和关系/弧/边的速度很慢。我知道这是因为每个 REST API 调用都作为一个独立的事务执行。

具体来说,添加几百对节点之间的关系需要几秒钟,在 localhost 上运行。

在使用 Python 的同时显着提高性能的最佳方法是什么?

使用bulbflow 和Gremlin 是构建批量插入事务的一种方式吗?

谢谢!

【问题讨论】:

  • 不知道这在 python 中如何,但通常在 java 中你可以使用批处理。 py中也应该有类似的东西。
  • 我尝试了 py2neo,发现它对于批量插入(或其他任何东西)来说太慢了。使用原始 REST 端点要快得多。

标签: python neo4j py2neo


【解决方案1】:

有几种方法可以使用py2neo 进行批量创建,每种方法只调用一次服务器。

  1. 使用create 方法在单个批次中构建多个节点和关系。
  2. 使用密码 CREATE 语句。
  3. 使用新的WriteBatch类(本周刚刚发布)手动制作一批节点和关系(这实际上只是1的手动版本)。

如果您有一些代码,我很乐意查看它并就性能调整提出建议。您可能还可以从中获得灵感。

干杯, 尼日

【讨论】:

  • 不错的答案,有可供尝试的选项。也感谢您抽出宝贵的时间 - 如果我遇到问题,我会与您联系。
  • 我仍然发现使用 get_or_create_relationships() 在类别节点和数据节点之间创建 60 万个简单关系需要几个小时。有什么想法吗?
  • 这些仍然是写入 Neo4j 的最快方法吗?在事务中创建元素并在一切完成后提交呢?
  • @NigelSmall,这是否优于您 create a GEOFF file 然后使用 Load2Neo 批量导入的两步过程?
  • @NigelSmall,有没有关于这个py2neo SO post的指针?
【解决方案2】:

Neo4j 的写入性能很慢,除非您进行批量插入。

Neo4j 批量导入器 (https://github.com/jexp/batch-import) 是将数据加载到 Neo4j 的最快方式。它是一个 Java 实用程序,但您不需要了解任何 Java,因为您只是在运行可执行文件。它处理类型化的数据和索引,并从 CSV 文件导入。

要将其与 Bulbs (http://bulbflow.com/) 模型一起使用,请使用模型 get_bundle() 方法获取准备插入的数据、索引名称和索引键,然后将数据输出到 CSV 文件。或者,如果您不想为数据建模,只需将数据从 Python 输出到 CSV 文件即可。

这对你有用吗?

【讨论】:

  • Neo4j 批量导入器仍然是最好的选择吗?
【解决方案3】:

网上有很多关于这个问题的旧答案,以至于我花了很长时间才意识到 neo4j 附带了一个导入工具。它非常快,是我能找到的最好的工具。

如果我们要导入学生节点,这里有一个简单的例子:

bin/neo4j-import --into [path-to-your-neo4j-directory]/data/graph.db --nodes students

学生文件包含如下所示的数据,例如:

studentID:Id(Student),name,year:int,:LABEL

1111,艾米,2000,学生

2222,简,2012,学生

3333,约翰,2013,学生

解释:

  • 标题解释了它下面的数据应该如何解释。
  • studentID 是 Id(Student) 类型的属性。
  • name 是默认的字符串类型。
  • 年份是整数
  • :LABEL 是这些节点的标签,在本例中为“Student”

这是它的文档:http://neo4j.com/docs/stable/import-tool-usage.html

注意:我意识到这个问题特别提到了 python,但另一个有用的答案提到了一个非 python 解决方案。

【讨论】:

    【解决方案4】:

    嗯,我自己也需要 neo4j 的强大性能。我最终会做以下事情来提高图形性能。

    1. 放弃了 py2neo,因为它存在很多问题。此外,使用 neo4j 提供的 REST 端点非常方便,只要确保使用请求会话即可。
    2. 使用原始密码查询进行批量插入,而不是任何 OGM(对象图映射器)。如果您需要高性能系统,这一点非常重要。
    3. 性能仍然不足以满足我的需求,因此我结束了编写一个自定义系统,该系统使用 WITH * AND UNION 子句将 6-10 个查询合并在一起。这将性能提高了 3 到 5 倍。
    4. 使用更大的事务大小,至少有 1000 个查询。

    【讨论】:

    • 我很想知道您在使用 py2neo 时遇到了什么问题。
    【解决方案5】:

    在 Neo4K 中高速插入大量节点

    批量插入器

    http://neo4j.com/docs/stable/batchinsert-examples.html

    就我而言,我正在研究 Java。

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2012-11-29
      • 2010-10-20
      相关资源
      最近更新 更多