将5834580的节点添加到空间层

时间:2018-06-22 13:06:43

标签: neo4j cypher neo4j-apoc neo4j-spatial

我正在尝试创建 5834580 个节点的 R-TREE
我在this question中发现了一个类似的问题,并尝试了它的解决方案,所以这是我的代码:

call apoc.periodic.commit("MATCH (pl:pickup_location) WITH collect(pl) AS pickup CALL spatial.addNodes('nyc',pickup) YIELD count RETURN count",{limit:1000})

但是,从昨天开始,计算机还没有完成加载结果。

今天,我尝试了第二个答案:

CALL apoc.periodic.iterate(
"MATCH (pl:pickup_location) RETURN pl",
"CALL spatial.addNode('nyc', pl) YIELD node RETURN node",
{batchSize:10000, parallel:false, listIterate:true})

我得到这个错误:

Neo.ClientError.Procedure.ProcedureCallFailed: Failed to invoke procedure `apoc.periodic.iterate`: Caused by: java.lang.OutOfMemoryError: Java heap space

怎么了?我该怎么办?

2 个答案:

答案 0 :(得分:2)

您对apoc.periodic.commit的问题是您的查询将始终返回与MATCH (pl:pickup_location)相同的节点。没有条件只查找不在空间布局中的节点。

我不记得空间插件的模型,但是根据我的记忆,在您的pickup_location节点上,您应该与R-Tree有特定的关系。

因此,您应该将aury转换为类似的内容:

CALL apoc.periodic.commit("
  MATCH (pl:pickup_location)
  WHERE NOT (p1)-[:LINKS->(:spatialNode) // Change this according to the spatial model
  WITH p1 AS node LIMIT $limit
  WITH collect(node) AS pickup 
    CALL spatial.addNodes('nyc',pickup) YIELD count 
    RETURN count",
  {limit:1000}
)

由于apoc.periodic.iterate上的问题仅是内存问题,因此您没有足够的RAM来执行事务。

您有两种解决方案:

  • 通过增加Neo4j的堆大小为Neo4j提供更多RAM(请参见neo4j.conf文件)
  • 减小批次的大小10000有点大,将其更改为1000

答案 1 :(得分:1)

由于我没有代表50的代表,所以我无法发表评论,但是logisima出现了,只是为了补充他们的答案...“ where not”子句应该是:

where not (p1)-[:RTREE_REFERENCE]-() 

RTREE_REFERENCE是将节点添加到空间层时创建的关系。