【问题标题】:What is the most efficient way to insert nodes into a neo4j database using cypher使用密码将节点插入neo4j数据库的最有效方法是什么
【发布时间】:2013-06-01 20:48:50
【问题描述】:

我正在尝试通过使用 py2neo python 模块 (py2neo.cypher.execute) 执行 cypher 命令将大量节点 (~500,000) 插入(非嵌入式)neo4j 数据库。最终我需要消除对 py2neo 的依赖,但我目前正在使用它,直到我了解更多关于 cypher 和 neo4j 的信息。

我有两种节点类型 A 和 B,绝大多数节点都是类型 A。有两种可能的关系 r1 和 r2,即 A-[r1]-A 和 A-[r2]-B。类型 A 的每个节点会有 0 - 100 个 r1 关系,类型 B 的每个节点会有 1 - 5000 个 r2 关系。

目前我正在通过构建大型 CREATE 语句来插入节点。例如我可能有一个声明

CREATE (:A {uid:1, attr:5})-[:r1]-(:A {uid:2, attr:5})-[:r1]-...

其中 ... 可能是另外 5000 个左右的节点和关系,在图中形成一个线性链。这工作正常,但速度很慢。我还使用索引这些节点

CREATE INDEX ON :A(uid)

添加所有类型 A 节点后,我再次使用 CREATE 语句添加类型 B 节点。最后,我尝试使用如下语句添加 r2 关系

MATCH c:B, m:A where c.uid=1 AND (m.uid=2 OR m.uid=5 OR ...)
CREATE (m)-[:r2]->(c)

其中 ... 可以代表几千个 OR 语句。这似乎真的很慢,每秒只添加几个关系。

那么,有没有更好的方法来做到这一点?我在这里完全偏离轨道了吗?我查看了this question,但这并没有解释如何使用 cypher 来有效地加载节点。我看到的其他所有内容似乎都使用 java,但没有显示可以使用实际的密码查询。

【问题讨论】:

    标签: python neo4j cypher


    【解决方案1】:

    在结束之前不要创建索引(在 2.0 中)。它会减慢节点的创建速度。

    您是否在 Cypher 中使用参数?

    我想你会失去很多密码解析时间,除非你的密码每次都与参数完全相同。如果您可以将其建模为那样,您将看到显着的性能提升。

    您已经在密码请求中发送了相当多的块,但是批处理请求 API 可以让您发送不止一个 REST 请求,这可能会更快(试试看!)。

    最后,如果这是一次性导入,您可以考虑使用批量导入工具——即使在硬件不好的情况下,它也可以在几分钟内烧毁 50 万个节点……然后您可以升级数据库文件(我不认为它可以创建 2.0 文件,但如果不能,可能很快就会出现),并通过 Cypher 创建您的标签/索引。

    更新:我刚刚注意到你最后的 MATCH 声明。你不应该这样做——一次只做一个关系,而不是对 ID 使用 OR。这可能会有很大帮助——并确保您使用 uid 的参数。即使您使用索引提示,Cypher 2.0 似乎也无法使用 OR 进行索引查找。也许这会在以后出现。

    2013 年 12 月更新:2.0 具有 Cypher 事务性端点,我已经看到了极大的吞吐量改进。我已经能够发送 20-30k Cypher 语句/秒,使用 100-200 语句的“exec”大小和 1000-10000 语句的总事务大小。对于加速 Cypher 的加载非常有效。

    【讨论】:

    • 我想要第二个 Wes cmets: 参数,较小的语句,如果您使用 2.0,请考虑使用 cypher 的事务性 http 端点,请参阅:neo4j.org/develop/labels 用于 cypher 和导入请参阅:neo4j.org/develop/import 和 @ 987654323@
    • 感谢您的建议。你知道如何在 Python 的 cypher CREATE 语句中使用参数吗?我能找到的关于参数的所有内容都是关于 Java 哈希映射的。
    • 在 py2neo 中,它是一个名为 params 的字典参数。 book.py2neo.org/en/latest/cypher.html 如果你只是在 HTTP 上做原始 JSON,你可以在 JSON 请求中添加一个 params:{uid:...} 和查询。
    • @EveFreeman 感谢 Eve,正如您在回答中所说,建议使用“批量导入工具”进行批量插入,您可以附加此工具的链接吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 2012-08-02
    • 2018-07-30
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多