繁体   English   中英

Neo4j:如何删除节点以外的所有节点和关系?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM