将参数与apoc.periodic.commit一起使用,给出OutOfMemoryError

时间:2020-06-12 17:10:00

标签: neo4j cypher neo4j-apoc

使用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一起使用

谢谢。

0 个答案:

没有答案