如何逐步从图中删除节点

时间:2014-10-29 18:19:35

标签: neo4j cypher

我有一个图表,由一个中心节点和连接到中央节点的大量其他节点组成。我想以事务方式删除节点,即从外部节点开始,分批删除它们,比如每个5K,然后继续向中心移动。

以下是一个控制台链接,其中包含一个小型示例图http://console.neo4j.org/?id=vwphbn供参考。

我的问题是匹配没有与中心节点(间接)连接它们的关系的节点。

UPD。我认为一些解释会有所帮助。我有一个大的分层数据集,我需要以块的形式删除,但是从传统方式开始(重复这个:

MATCH (n: Root {rootId : {rootId}})
OPTIONAL MATCH n-[r]-x
DELETE r,x
RETURN count(*)

虽然count > 0)可能导致删除Root本身,并且某些子节点将被孤立而无法检测和删除它们,我想,应该有某种方式我仍然可以或多或少地廉价地删除图表的块,同时具有一些排序并保留基石 - 根节点。

1 个答案:

答案 0 :(得分:2)

使用示例图表,以下查询将按预期批量修剪图表:

MATCH p=(n1:Node)<-[r*]-(n2)
WHERE NOT (n2)<--()
WITH last(nodes(p)) AS n
LIMIT 5000
MATCH (n)-[r]->()
DELETE r, n

值得注意的是,此查询中的第一个MATCH语句将导致大规模的性能问题。要解决此问题,您可以将标签应用于连接到根节点的所有节点,然后执行以下操作:

MATCH (n1:Nodes)
WHERE NOT (n1)<--()
LIMIT 5000
MATCH (n)-[r]->()
DELETE r, n

这只会逐层删除节点。这意味着如果您多次运行此查询,它将删除最后一层的一部分,然后在下一个查询中删除下一个内层的一部分以及最后一个外层。

更新

此外,如果您要逐个切片,此查询将一次删除一个切片:

MATCH p=(n1:Node)<-[r*]-(n2)
WHERE NOT (n2)<--()
WITH nodes(p) AS slices
LIMIT 1 UNWIND slices AS n
MATCH (n)-[r]->()
DELETE r, n