【发布时间】: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,但没有显示可以使用实际的密码查询。
【问题讨论】: