将 5834580 个节点添加到 Spatial Layer
Adding 5834580 of node to Spatial Layer
我正在尝试创建 5834580 个节点的 R-TREE。
我在 中发现了一个类似的问题,我尝试了它的解决方案,所以这是我的代码:
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
怎么了?我该怎么办?
您的 apoc.periodic.commit
问题是您的查询总是 return 与您的 MATCH (pl:pickup_location)
相同的节点。没有条件只查找不在空间布局中的节点。
我不记得空间插件的型号,但据我记得,在你的 pickup_location
节点上,你应该与 R-Tree 有特定关系。
所以你应该把你的 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
文件)
- 减小batch的大小,
10000
有点大,改成1000
因为我没有 50 的代表,所以我无法发表评论,但 logisima 是正确的,只是为了添加到他们的答案中...... "where not" 子句应该是:
where not (p1)-[:RTREE_REFERENCE]-()
RTREE_REFERENCE 是将节点添加到空间层时创建的关系。
我正在尝试创建 5834580 个节点的 R-TREE。
我在
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
怎么了?我该怎么办?
您的 apoc.periodic.commit
问题是您的查询总是 return 与您的 MATCH (pl:pickup_location)
相同的节点。没有条件只查找不在空间布局中的节点。
我不记得空间插件的型号,但据我记得,在你的 pickup_location
节点上,你应该与 R-Tree 有特定关系。
所以你应该把你的 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
文件) - 减小batch的大小,
10000
有点大,改成1000
因为我没有 50 的代表,所以我无法发表评论,但 logisima 是正确的,只是为了添加到他们的答案中...... "where not" 子句应该是:
where not (p1)-[:RTREE_REFERENCE]-()
RTREE_REFERENCE 是将节点添加到空间层时创建的关系。