[英]Neo4j: How to delete all nodes and relationships beyond a node?
这是一个简单的图形:
(:a)-[:r]->(:b)
如果要删除(:b)
,我可以使用:
MATCH (a)-[r]->(b :b)
DELETE a, r, b
但是, (b)
可以具有多个关系和脱离的节点(这些节点也可以递归地具有更多的关系和节点)。 像这样:
(:a)-[:r]->(:b)-[:s]->(x)-[:r]->(y)- ... ->(z)
如何递归删除(b)
以外的每个节点和关系?
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将删除子图中的所有关系,然后删除子图中的所有节点。
要从节点递归删除,可以使用路径变量 : 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
指定路径来执行此操作,而第二个查询通过允许零跳的路径来执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.