neo4j - 使用 cypher 和 apoc 将数百万个节点添加到 neo4j 空间层

标签 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 是否是比定期迭代更好的选择?

最佳答案

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

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

问候, 汤姆

关于neo4j - 使用 cypher 和 apoc 将数百万个节点添加到 neo4j 空间层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45904154/

相关文章:

Neo4j cypher 时间树的时间间隔直方图查询

neo4j - 如何使用 Cypher 返回原始节点 5 跳内相关的所有节点

Neo4j 空间密码查询 withinDistance 不返回现有节点

neo4j - 无法在 neo4j 空间中找到几何

neo4j - 在 Neo4j 中获取每种类型的节点属性和每种类型的关系属性

Neo4j 如何从某个起始节点递归删除节点

ruby-on-rails - NEO4j - Cypher - 事件源 - 多个左连接,数据透视表/交叉表,用于可选节点?

neo4j - 无法正确排序和限制子节点; WITH + 可选匹配

neo4j - SyntaxError, "Unknown procedure output: ` node`"是什么意思?

spring - 无法将具有 @RelatedTo 传出方向的 NodeEntity 与另一个节点一起保存