我需要在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之后,插入速度很快就会慢下来,而且我不能放任何其他节点。
答案 0 :(得分:1)
你的问题很开放。除了@InverseFalcon的建议之外,还有一些其他的事情可以调查以加快速度。
阅读性能调优文档,并按照建议操作。特别是,您可能会遇到与内存相关的问题,因此Memory Tuning部分可能会非常有用。
您的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,这是您合并的第一个。看起来你也需要一个独特的约束。