Neo4j 将节点的5834580添加到空间层

Neo4j 将节点的5834580添加到空间层,neo4j,cypher,neo4j-apoc,neo4j-spatial,Neo4j,Cypher,Neo4j Apoc,Neo4j Spatial,我正在尝试创建一个包含5834580个节点的R树。 我发现了一个类似的问题,并尝试了它的解决方案,所以这是我的代码: call apoc.periodic.commit("MATCH (pl:pickup_location) WITH collect(pl) AS pickup CALL spatial.addNodes('nyc',pickup) YIELD count RETURN count",{limit:1000}) 但是,从昨天开始,计算机没有完成加载结果。 今天,我用iterat

我正在尝试创建一个包含5834580个节点的R树。
我发现了一个类似的问题,并尝试了它的解决方案,所以这是我的代码:

call apoc.periodic.commit("MATCH (pl:pickup_location) WITH collect(pl) AS pickup CALL spatial.addNodes('nyc',pickup) YIELD count RETURN count",{limit:1000})
但是,从昨天开始,计算机没有完成加载结果。

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

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

怎么了?我该怎么办?

您的
apoc.periodic.commit问题在于,您的查询将始终返回与
匹配的相同节点(pl:picku location)
。不存在只查找不在空间布局中的节点的条件

我不记得spatial插件的模型,但根据我的记忆,在您的
picku位置
节点上,您应该与R树有特定的关系

因此,您应该将您的auery转换为以下内容:

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

由于我没有50岁的代表,我无法发表评论,但罗吉思玛很在行,只是想补充一下他们的答案。。。“非”条款应为:

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

RTREE_引用是在向空间层添加节点时创建的关系

我在
commit()
的查询中没有看到
limit
的用法。与
apoc.periodic.iterate()
不同,您必须明确添加
limit
的用法。特别是在这个查询中,
limit
的位置非常重要,因为您要收集到1行,所以为了使此查询有效,您需要在执行collect()的With子句之前使用
With pl limit{limit}
。我已经更新了我的响应:)感谢您指出了这个缺少的部分