使用Python在Neo4j中执行批量添加/插入的最快方法?

时间:2012-09-28 16:15:37

标签: python neo4j py2neo

我发现当通过py2neo for Python使用REST API时,Neo4j很慢地添加节点和关系/弧/边缘。我知道这是因为每个REST API调用都是作为一个自包含的事务执行的。

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

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

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

谢谢!

5 个答案:

答案 0 :(得分:9)

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

  1. 使用create方法在一个批处理中构建多个节点和关系。
  2. 使用cypher CREATE语句。
  3. 使用新的WriteBatch类(本周刚刚发布)手动制作一批节点和关系(这实际上只是手动版本的1)。
  4. 如果您有一些代码,我很高兴看到它并就性能调整提出建议。您也可以从中获得灵感。

    干杯, 的NiGe

答案 1 :(得分:6)

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

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

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

这对你有用吗?

答案 2 :(得分:2)

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

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

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

学生档案包含如下所示的数据,例如:

  

studentID:ID(学生),姓名,年:INT,:LABEL

     

1111,艾美,2000,学生

     

2222,简,2012,学生

     

3333,约翰,2013,学生

说明:

  • 标题解释了如何解释下面的数据。
  • studentID是类型为Id(学生)的属性。
  • name的类型为string,这是默认值。
  • 年是一个整数
  • :LABEL是这些节点所需的标签,在这种情况下它是"学生"

以下是其文档:http://neo4j.com/docs/stable/import-tool-usage.html

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

答案 3 :(得分:1)

好吧,我自己需要neo4j的大量表现。我最终做了以下事情来提高图表性能。

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

答案 4 :(得分:0)

以极高的速度向Neo4K插入大量节点

批量插入器

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

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