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

Neo4j 如何使用Cypher从单个节点上删除数百万个关系,neo4j,cypher,Neo4j,Cypher,我在Neo4j中创建了一个大型图,其中有一个空节点,通过图中的1100万个关系连接,我需要删除它。我知道,如果我只是删除节点,我会留下所有挂起的关系,但我在尝试删除它们时失败了。我尝试了以下密码命令,但它们挂起且无法完成: MATCH (n:Label {uid: ''}) DETACH DELETE n; 及 我的工作假设没有足够的资源在内存中加载1100万个关系子图,以便分离和删除节点。是否有任何方法在关系上循环以降低所需的系统资源?您可以批量删除关系,然后删除节点 MATCH (n:La

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

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


我的工作假设没有足够的资源在内存中加载1100万个关系子图,以便分离和删除节点。是否有任何方法在关系上循环以降低所需的系统资源?

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

MATCH (n:Label {uid: ''})-[r]-() 
WITH r
LIMIT 1000
DELETE r;
如果连续运行,将以小批量删除关系。使用限制数量,查看您的运行系统在资源方面能够承受的限制。

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

call apoc.periodic.commit(
  'MATCH (n:Label {uid: {uid}})-[r]->() 
   WITH r LIMIT {limit}
   DELETE r 
   RETURN COUNT(r)', {
     limit: 1000,
     uid: ...
})
2) 您可以删除节点,然后使用以下函数再次创建它:

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

太好了,谢谢你;我尝试了一些类似的东西,但没有“WITH r”部分,结果失败了。很好,它似乎可以处理100万个问题,所以我只编写了一点python,使用bolt驱动程序重复调用12次。再次感谢。我没有在服务器上安装APOC,但我会要求开发人员添加它。我可以看到1)可能会如何工作,但2)不会出现与我目前遇到的问题相同的问题,即系统无法根据我可用的系统资源一次性分离和删除这么多关系?
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