使用cypher和apoc向neo4j空间层添加数百万个节点
我有一个380万节点的数据集,我正试图将所有这些节点加载到Neo4j spatial中。节点将进入一个简单的点图层,因此具有所需的纬度和经度字段。我试过:使用cypher和apoc向neo4j空间层添加数百万个节点,neo4j,cypher,neo4j-spatial,neo4j-apoc,Neo4j,Cypher,Neo4j Spatial,Neo4j Apoc,我有一个380万节点的数据集,我正试图将所有这些节点加载到Neo4j spatial中。节点将进入一个简单的点图层,因此具有所需的纬度和经度字段。我试过: MATCH (d:pointnode) WITH collect(d) as pn CALL spatial.addNodes("point_geom", pn) yield count return count 但这只是继续旋转,没有任何事情发生。我也尝试过(我一直在一行上运行下一个查询,但为了便于阅读,我只是将其拆分): 但是再次出
MATCH (d:pointnode)
WITH collect(d) as pn
CALL spatial.addNodes("point_geom", pn) yield count return count
但这只是继续旋转,没有任何事情发生。我也尝试过(我一直在一行上运行下一个查询,但为了便于阅读,我只是将其拆分):
但是再次出现了大量的旋转和偶尔出现的JAVA堆错误
我尝试的最后一种方法是将FME与HTTP调用程序一起使用,这种方法可以工作,但速度非常慢,因此无法很好地扩展到数百万个节点
如有任何意见或建议,将不胜感激。apoc.periodic.commit或apoc.periodic.rock_____roll是比定期迭代更好的选择吗 您有380000个节点,您可以在one列表中收集它们。。。然后你调用一次,将列表添加到图层中。。。这需要一段时间,消耗大量的记忆apoc.periodic.iterate完全没有区别,因为您只调用一个spatial.addNodes 这可能需要一段时间,但为什么不逐点添加它们呢
CALL apoc.periodic.iterate(
"MATCH (d:pointnode) RETURN d",
"CALL spatial.addNode('point_geom', d) YIELD node RETURN node"
{batchSize:10000, parallel:false, listIterate:true})
希望这能有所帮助(或者至少能解释为什么你会有问题)
问候,,
Tom经过一点尝试和错误后,定期提交已导致相对快速的解决方案(仍然需要2-3个小时) 批量越大,速度越快
批量大小为5000的编辑需要45分钟谢谢,确实有效,但正如您所说的,速度非常慢。我认为apocalype.periodic.commit不会同时读取所有节点,这对吗?因此,如果语法正确,它将读取前10000个节点,将它们添加到空间层。然后继续,因此需要更少的内存?是的,但需要先标记需要处理的节点,然后删除已处理的一批节点的标记。这当然需要额外的处理(read:time),但会减少内存使用。然而,3800000节点的标记本身也需要时间和内存,因此,如果我最初的解决方案对您来说是可行的(内存方面…您仍然可以稍微增加批处理大小),您可能希望坚持这一点。感谢您的建议,Tom,问题的答案在于定期提交,我将把该解决方案作为一个答案发布{limit:1000}do??限制批处理的大小,因此在每个委员会的空间层中添加1000个节点。与您有相同的问题,但是您的解决方案不适用于我,这是我的问题
CALL apoc.periodic.iterate(
"MATCH (d:pointnode) RETURN d",
"CALL spatial.addNode('point_geom', d) YIELD node RETURN node"
{batchSize:10000, parallel:false, listIterate:true})
call apoc.periodic.commit("match (n:pointnode)
where not (n)-[:RTREE_REFERENCE]-() with n limit {limit}
WITH collect(n) AS pnodes
CALL spatial.addNodes('point_geom', pnodes) YIELD count return count",
{limit:1000})