使用 cypher 和 apoc 将数百万个节点添加到 neo4j 空间层
Adding millions of nodes to neo4j spatial layer using cypher and 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 是比定期迭代更好的选择吗?
你有 3 800 000 个节点,你将它们收集在 one 列表中......然后你调用 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})
希望这对您有所帮助(或至少解释了您遇到问题的原因)。
此致,
汤姆
经过一些反复试验后,定期提交导致了一个相对快速的解决方案(仍然需要 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 分钟
我有一个包含 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 是比定期迭代更好的选择吗?
你有 3 800 000 个节点,你将它们收集在 one 列表中......然后你调用 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})
希望这对您有所帮助(或至少解释了您遇到问题的原因)。
此致, 汤姆
经过一些反复试验后,定期提交导致了一个相对快速的解决方案(仍然需要 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 分钟