如何在Neo4J中插入大量节点

时间:2016-12-12 07:03:31

标签: 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:ipNode8 {ip:"' + prev + '"}),(b:ipNode8 {ip:"' + next + '"}) MERGE (a)-[:precede]->(b)'

问题是在将40-50K节点放入Neo4j之后,插入速度很快就会慢下来,而且我不能放任何其他节点。

2 个答案:

答案 0 :(得分: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程序。

答案 1 :(得分:0)

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

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

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