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

时间:2016-11-19 14:55:41

标签: neo4j

这是一个简单的图表:

(:a)-[:r]->(:b)

如果要删除(:b),我可以执行以下操作:

MATCH (a)-[r]->(b :b)
DELETE a, r, b

但是,(b)可以有多个关系和节点(这些节点可以递归地拥有更多的关系和节点)。像这样:

(:a)-[:r]->(:b)-[:s]->(x)-[:r]->(y)- ... ->(z)

如何递归删除(b)以外的每个节点和关系?

2 个答案:

答案 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 variablesp=(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中指定路径来完成此操作,而第二个查询通过允许零跳的路径来完成此操作。