Graph 如何在Neo4J中插入大量节点

Graph 如何在Neo4J中插入大量节点,graph,neo4j,nodes,traceroute,Graph,Neo4j,Nodes,Traceroute,我需要在Neo4j中插入大约100万个节点。我需要指定每个节点都是唯一的,因此每次插入节点时都必须检查是否存在相同的节点。此外,关系必须是唯一的 我正在使用Python和Cypher: uq = 'CREATE CONSTRAINT ON (a:ipNode8) ASSERT a.ip IS UNIQUE' ... queryProbe = 'MERGE (a:ipNode8 {ip:"' + prev + '"})' ... queryUpdateRelationship= 'MATCH (a

我需要在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)'

问题是,将40-50K节点放入Neo4j后,插入速度会很快减慢,我无法再放入任何其他节点。

对于这样的大规模插入,最好与定期提交或

我认为使用参数化查询而不是将值追加到字符串中也是最佳实践


此外,您还在:ipNode8上创建了一个唯一的属性约束,而不是:ipNode,后者是第一个合并的属性约束。似乎你也需要一个独特的约束条件。

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

  • 阅读性能调整文档,并遵循建议。特别是,您可能会遇到与内存相关的问题,因此本节可能非常有用

  • 您的密码查询可能会加快。例如,如果有意义,您可以尝试以下方法。
    数据
    应该是格式为
    {a:123,b:234}
    的对象列表。您可以使列表尽可能长(例如,20K),以避免在服务器在单个事务中处理列表时耗尽服务器上的内存。(此查询假设您还希望创建
    b
    (如果它不存在)

    您也可以使用APOC程序

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