这是一个简单的图表:
(:a)-[:r]->(:b)
如果要删除(:b)
,我可以执行以下操作:
MATCH (a)-[r]->(b :b)
DELETE a, r, b
但是,(b)
可以有多个关系和节点(这些节点可以递归地拥有更多的关系和节点)。像这样:
(:a)-[:r]->(:b)-[:s]->(x)-[:r]->(y)- ... ->(z)
如何递归删除(b)
以外的每个节点和关系?
答案 0 :(得分:2)
DETACH DELETE在这里很有用。这首先删除节点中的所有关系,然后删除节点本身。这使您的查询更容易,因为您只需要查询从b节点可以访问的所有节点。
我现在假设你问题中的这个b
节点是一个特定节点,而不是每个标签为:b
的节点。我鼓励您重新阅读有关变量和标签的开发人员文档,因为我猜这里有点混乱。
因此,假设一个特定的b节点,并假设它有一个可以区分它的name属性,你可以使用这个查询来删除它,并将整个子图连接到它并从中可以访问。
MATCH (b:b)-[*0..]-(x)
WHERE b.name = 'b'
WITH DISTINCT x
DETACH DELETE x
请注意,因为我们不关心关系类型,并且因为我们已经指定了0个或更多关系,所以无论关系有多少,x都将匹配b及其整个连接的子图。分离和删除x将删除子图中的所有关系,然后删除子图中的所有节点。
答案 1 :(得分:1)
要从节点递归删除,您可以使用path variables:p=(source)-[type*minimumHops..maximumHops]->(target)
(默认情况下,minimumHops
为1)。
示例数据集:
CREATE
(a:a)-[:r]->(b:b),
(b)-[:r]->(c:c),
(c)-[:r]->(d:d),
(b)-[:r]->(e:e)
查询:
MATCH (a:a)-[r:r]->(b:b)
OPTIONAL MATCH p=(b)-[:r*]->(c)
DELETE a, r, b, p
另一种等效查询:
MATCH
(a:a)-[r:r]->(b:b),
p=(b)-[:r*0..]->(c)
DELETE a, r, p
值得注意的是,两者都可以在您的图表中只有一个(:a)-[:r]->(:b)
边缘的角落中工作。第一个查询通过在OPTIONAL MATCH
中指定路径来完成此操作,而第二个查询通过允许零跳的路径来完成此操作。