Neo4j 如何逐渐从图中删除节点

Neo4j 如何逐渐从图中删除节点,neo4j,cypher,Neo4j,Cypher,我有一个由一个中心节点和大量连接到中心节点的其他节点组成的图。我希望以事务方式删除节点,即从外部节点开始,批量删除它们,比如说,每个5K,然后继续向中心移动 这里是一个控制台链接,其中包含一个供参考的小示例图 我的问题是匹配那些没有关系的节点,而不是那些(间接地)将它们连接到中心节点的节点 Upd。我想一些解释会有帮助。我有一个大的分层数据集,我需要分块删除,但由于传统的方式(重复此: MATCH (n: Root {rootId : {rootId}}) OPTIONAL MATCH n-[r

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

这里是一个控制台链接,其中包含一个供参考的小示例图

我的问题是匹配那些没有关系的节点,而不是那些(间接地)将它们连接到中心节点的节点

Upd。我想一些解释会有帮助。我有一个大的分层数据集,我需要分块删除,但由于传统的方式(重复此:

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

虽然
count>0
)可能会导致删除
Root
本身,并且一些子节点将成为孤立节点,无法检测和删除它们,但我认为,应该有某种方式,我仍然可以或多或少地删除图块,同时进行一些排序并保留基石根节点。

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

MATCH p=(n1:Node)<-[r*]-(n2)
WHERE NOT (n2)<--()
WITH last(nodes(p)) AS n
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

MATCH p=(n1:Node)问题是数据库中的“圆”上有不止一个,所以我不能仅仅通过标签来匹配。但你启发我设计了另一种方法,它不是以这种“同心”的方式删除实体,而是以一种类似于切片饼的方式:匹配一组路径
match(r:Root)-[rel]-(n),p=((n)-[r*]-(k))
,然后删除
rel
p
,在所有的“切片”都被“切割”后,我就剩下根了。这种方法值得一试吗?由于p将匹配所有路径,如
(a)
(a)-(b)
(a)-(b)-(c)
等,也许最好。。。。。。要收集路径中的所有节点,请对它们执行
DISTINCT
,然后在
FOREACH
块中删除它们?我非常喜欢这个想法。下面是我建议使用UNWIND:MATCH p=(n1:Node)Wow的查询!我确实完全错过了
放松
条款。这真是太好了!感谢您抽出时间:)
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