如何使用Cypher从单个节点上删除数百万个关系

时间:2018-03-09 14:57:16

标签: neo4j cypher

我在Neo4j中创建了一个大图,并且有一个空节点,通过我需要删除的图中的1,100万个关系连接。我知道,如果我只是删除节点,我会留下所有挂起的关系,但我试图删除它们是不成功的。我已经尝试了以下CYPHER命令,但它们挂起并且无法完成:

MATCH (n:Label {uid: ''}) DETACH DELETE n;

MATCH (n:Label {uid: ''})-[r]-() DELETE r;

我的假设是没有足够的资源来加载内存中的1100万关系子图,以便分离和删除节点。有没有办法循环关系以降低所需的系统资源?

2 个答案:

答案 0 :(得分:2)

您可以批量删除关系,然后删除节点

MATCH (n:Label {uid: ''})-[r]-() 
WITH r
LIMIT 1000
DELETE r;

如果您连续运行,则会以小批量删除关系。玩限制金额以查看您的运行系统将在资源方面容忍的内容。

答案 1 :(得分:2)

1)您可以使用apoc库中的apoc.periodic.commit函数:

call apoc.periodic.commit(
  'MATCH (n:Label {uid: {uid}})-[r]->() 
   WITH r LIMIT {limit}
   DELETE r 
   RETURN COUNT(r)', {
     limit: 1000,
     uid: ...
})

2)您可以删除节点,然后使用apoc.create.node功能再次创建它:

MATCH (n:Label {uid: 2})
WITH n, {labels: labels(n), properties: properties(n)} AS data
DETACH DELETE n
WITH data
CALL apoc.create.node(data.labels, data.properties) yield node AS newNode
RETURN newNode