gpt4 book ai didi

python - 使用密码将节点插入 neo4j 数据库的最有效方法是什么

转载 作者:太空狗 更新时间:2023-10-29 23:59:39 25 4
gpt4 key购买 nike

我正在尝试通过使用 py2neo python 模块 (py2neo.cypher.execute) 执行密码命令,将大量节点 (~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但这并没有解释如何使用密码来有效地加载节点。我看到的所有其他东西似乎都使用 java,但没有显示可以使用实际的密码查询。

最佳答案

直到最后才创建索引(在 2.0 中)。它会减慢节点创建速度。

您是否在 Cypher 中使用参数?

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

您已经在密码请求中发送了相当大的数据 block ,但是批处理请求 API 将允许您发送多个 REST 请求中的一个,这可能会更快(试试吧!)。

最后,如果这是一次性导入,您可以考虑使用批量导入工具——它可以在几分钟内烧毁 500K 个节点,即使在硬件不好的情况下……然后您可以升级数据库文件(我不要认为它可以创建 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 的加载非常有效。

关于python - 使用密码将节点插入 neo4j 数据库的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16952024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com