在Neo4J中,在从节点中删除关系时,如何同时删除没有其他关系的节点本身?

问题描述 投票:0回答:2

在删除关系时,我想了解节点是否会成为孤立节点,如果是,则也删除该节点。

输入图示例:

(a)-[r1]-(b)-[r2]-(c)-[r3]-(d)

删除关系 r3 后的预期图形:(d) 将是孤立的,因此删除它。

(a)-[r1]-(b)-[r2]-(c)

删除关系r2后的预期图:两个分割图,没有删除节点。

(a)-[r1]-(b)   
(c)-[r3]-(d)

可以用密码实现这一点吗?

neo4j cypher
2个回答
3
投票

如果您想单独删除关系及其当时的孤立节点,请尝试首先获取要删除的关系的起始节点和结束节点,删除该关系,然后测试节点是否“孤立”并有条件地删除它们。您可以通过将开始/结束节点放入集合中,以

NOT n--()
作为谓词过滤集合,然后在
FOREACH
循环中删除过滤后的集合中的节点来实现此目的。

MATCH (a {name:"Federico"})-[r1]-(b)-[r2]-(c)-[r3]-(d)
WITH r3, [startNode(r3), endNode(r3)] as ns
DELETE r3
WITH [n IN ns WHERE NOT n--()] as orphans
FOREACH (n IN orphans | DELETE n)

如果您想一次删除多个关系,您可以尝试将模式绑定为路径

MATCH path=(a {name:"Federico"})-[r1]-(b)-[r2]-(c)-[r3]-(d)

然后在你删除了一些关系之后

DELETE r1, r3

您可以过滤路径中的所有节点并删除孤儿,如上所述

WITH [n IN nodes(path) WHERE NOT n--()] as orphans
FOREACH (n IN orphans | DELETE n)

只要您删除的关系在路径中,它们留下的任何孤立节点也将被删除。

(我目前无法测试这些查询,但我认为我的语法是正确的。)


2
投票

简而言之,您正在尝试删除图中任何没有任何关系的孤立节点。

MATCH (a)-[r1]-(b)-[r2]-(c)-[r3]-(d) 
WITH r3, startNode(r3) AS sR, endNode(r3) AS eR 
DELETE r3 
WITH sR,eR 
MATCH n 
WHERE n IN [sR,eR] AND NOT n--() 
DELETE n

上面将删除删除关系 r3 后所有孤立的节点

© www.soinside.com 2019 - 2024. All rights reserved.