【问题标题】:How to insert large number of nodes into Neo4J如何将大量节点插入 Neo4J
【发布时间】:2016-12-12 07:03:31
【问题描述】:

我需要在 Neo4j 中插入大约 100 万个节点。我需要指定每个节点都是唯一的,所以每次我插入一个节点时,都必须检查是否还没有相同的节点。此外,关系必须是唯一的。

我正在使用 Python 和 Cypher:

uq = 'CREATE CONSTRAINT ON (a:ipNode8) ASSERT a.ip IS UNIQUE'
...
queryProbe = 'MERGE (a:ipNode8 {ip:"' + prev + '"})'
...
queryUpdateRelationship= 'MATCH (a:ipNode8 {ip:"' + prev + '"}),(b:ipNode8 {ip:"' + next + '"}) MERGE (a)-[:precede]->(b)'

问题是在 Neo4j 中放入 40-50K 节点后,插入速度很快变慢,我无法放入其他任何东西。

【问题讨论】:

    标签: graph neo4j nodes traceroute


    【解决方案1】:

    你的问题很开放。除了@InverseFalcon 的建议之外,您还可以调查以下其他一些事情来加快速度。

    1. 阅读性能调优文档,并遵循建议。特别是,您可能会遇到与内存相关的问题,因此Memory Tuning 部分可能会很有帮助。

    2. 您的 Cypher 查询可能会加快速度。例如,如果有意义,您可以尝试以下方法。 data parameter 应该是具有{a: 123, b: 234} 格式的对象列表。您可以使列表尽可能长(例如,20K),以避免在单个事务中处理列表时服务器上的内存不足。 (此查询假设您还想创建b,如果它不存在。)

      UNWIND {data} AS d
      MERGE (a:ipNode8 {ip: d.a})
      MERGE (b:ipNode8 {ip: d.b})
      MERGE (a)-[:precede]->(b)
      

      您还可以使用periodic execution APOC 程序。

    【讨论】:

      【解决方案2】:

      对于这样的批量插入,最好使用LOAD CSV 和定期提交或import tool

      我认为使用参数化查询而不是将值附加到字符串中也是最佳做法。

      此外,您在 :ipNode8 上创建了一个唯一的属性约束,但不是 :ipNode,这是您合并的第一个。似乎你也需要一个唯一的约束。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        相关资源
        最近更新 更多