使用cypher和apoc

时间:2017-08-27 10:51:03

标签: neo4j cypher neo4j-spatial neo4j-apoc

我有一个380万个节点的数据集,我试图将所有这些加载到Neo4j空间中。节点进入简单的点层,因此具有所需的纬度和经度字段。我试过了:

MATCH (d:pointnode) 
WITH collect(d) as pn 
CALL spatial.addNodes("point_geom", pn) yield count return count

但这只是在没有任何事情发生的情况下继续旋转。我也试过了(我已经在一行上运行了下一个查询,但我为了便于阅读而将其分开):

CALL apoc.periodic.iterate("MATCH (d:pointnode) 
WITH collect(d) AS pnodes return pnodes",
"CALL spatial.addNodes('point_geom', pnodes) YIELD count return count", 
{batchSize:10000, parallel:false, listIterate:true})

但是很多旋转和偶尔的JAVA堆错误。

我尝试的最后一种方法是将FME与HTTP调用者一起使用,这种方法很有效,但速度非常慢,因此不能很好地扩展到数百万个节点。

非常感谢任何建议或意见。请问apoc.periodic.commit或apoc.periodic.rock_n_roll比周期性迭代更好吗?

2 个答案:

答案 0 :(得分:2)

您有3 800 000个节点,您可以在一个列表中收集这些节点...然后您执行一次调用以将该列表添加到图层中...这需要一段时间,吃掉大量的记忆。 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})

希望这会有所帮助(或者至少可以解释为什么会遇到问题)。

此致 汤姆

答案 1 :(得分:0)

经过一些试验和错误定期提交导致了一个相对快速的解决方案(仍需要2-3个小时)

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})

批量较大时可能会更快

编辑批量大小为5000,需要45分钟