在删除关系时,我想了解节点是否是孤儿,如果是,则删除该节点。
示例输入图:
(a)-[r1]-(b)-[r2]-(c)-[r3]-(d)
删除关系r3后的预期图:(d)将是孤儿,所以删除它。
(a)-[r1]-(b)-[r2]-(c)
删除关系r2后的预期图:两个拆分图,没有删除节点。
(a)-[r1]-(b)
(c)-[r3]-(d)
是否有可能在密码中实现这一目标?
答案 0 :(得分:0)
简而言之,您试图删除图表中没有任何关系的任何孤立节点。
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后孤立的所有节点
答案 1 :(得分:0)
如果要同时删除与其当时孤立节点的关系,请先尝试获取要删除的关系的开始和结束节点,删除关系,然后测试节点是否“孤立”并有条件地删除它们。您可以通过将开始/结束节点放在集合中,将NOT n--()
上的集合作为谓词过滤,然后在FOREACH
循环中删除过滤集合中的节点来完成此操作。
MATCH (a {name:"Federico"})-[r1]-(b)-[r2]-(c)-[r3]-(d)
WITH r3, [startNode(r3), endNode(r3)] as ns
DELETE r3
WITH FILTER(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 FILTER(n IN nodes(path) WHERE NOT n--()) as orphans
FOREACH (n IN orphans | DELETE n)
只要您删除的关系位于路径中,他们留下的任何孤立节点也将被删除。
(我目前无法测试这些查询,但我认为我的语法正确。)