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

wz8daaqr  于 2023-03-02  发布在  其他
关注(0)|答案(3)|浏览(154)

我在Neo4j中创建了一个大型图表,图表中有一个通过1100万个关系连接的空节点需要删除。我知道,如果我只删除该节点,我将留下所有挂起的关系,但我尝试删除这些关系时失败。我尝试了以下CYPHER命令,但它们挂起且无法完成:

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

以及

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

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

lf5gs5x2

lf5gs5x21#

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
b5buobof

b5buobof2#

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

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

如果你连续运行,你将以小批量删除关系。玩限制的数量,看看你的运行系统将容忍资源明智。

sxpgvts3

sxpgvts33#

如果您使用的是Neo4j 4.0或更高版本,那么这是最好的方法:

MATCH (n:Label {uid: ''})-[r]-() 
CALL { 
  WITH r 
  DELETE r 
} IN TRANSACTIONS OF 1000 ROWS;

相关问题