17

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

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

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

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

谢谢!

4

5 回答 5

9

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

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

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

干杯,尼日

于 2012-09-29T00:48:27.900 回答
6

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

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

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

这对你有用吗?

于 2012-10-01T15:17:59.720 回答
2

网上有很多关于这个问题的旧答案,以至于我花了很长时间才意识到 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 是您想要这些节点的标签,在这种情况下它是“学生”

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

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

于 2015-06-24T11:20:18.997 回答
2

好吧,我自己也需要 neo4j 的大规模性能。我最终做了以下事情来提高图形性能。

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

以非常高的速度将大量节点插入到 Neo4K

批量插入器

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

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

于 2015-12-24T20:17:30.207 回答