使用apoc.periodic.commit删除单个节点中的所有关系(大约200万个),然后调用删除该节点的操作时,我遇到一些奇怪的行为:
MATCH(node:SomeNodeType)
WITH ID(node) AS nodeId
CALL apoc.periodic.commit("MATCH (node:SomeNodeType)-[rel:NodeRel]->() WHERE ID(node) = $nodeId
WITH rel LIMIT $limit DELETE rel RETURN COUNT(rel)",
{limit:2000, params: { nodeId: nodeId}})
YIELD updates
MATCH (node:SomeNodeType) WHERE ID(node) = 4 DETACH DELETE node
RETURN updates
这将导致Neo.TransientError.General.OutOfMemoryError。 我的Neo4j实例正在Docker中运行,为了使用较小的数据大小强制执行此错误,我使用以下命令为它提供了512m的内存:-JAVA_OPTIONS = -Xmx512m环境变量。相反,给它2Gb可以得到相同的结果,上面的查询失败,并且以下成功:
CALL apoc.periodic.commit("MATCH (node:SomeNodeType)-[rel:NodeRel]->() WHERE ID(node) = 4
WITH rel LIMIT $limit DELETE rel RETURN COUNT(rel)",
{limit:2000})
YIELD updates
MATCH (node:SomeNodeType) WHERE ID(node) = 4 DETACH DELETE node
RETURN updates
查询之间唯一真正的区别是输入到apoc.periodic.commit中的参数匹配SomeNodeType,我想不出为什么这会导致查询使用更多内存的原因。是否有人对这里发生的事情有更多的了解?
将Neo4j 4.0.0 Docker映像与APOC 4.0.0.4一起使用
谢谢。