2

我有一个包含 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 会比周期性迭代更好吗?

4

2 回答 2

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

希望这会有所帮助(或者至少可以解释您遇到问题的原因)。

问候,汤姆

于 2017-08-27T16:25:05.253 回答
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 分钟

于 2017-08-29T08:44:42.193 回答