我想获得一个节点,删除某个类型的所有传出关系,然后添加返回关系。
我遇到的问题是,一旦我抓住了节点,它仍然可以维持其以前的关系,因此删除后,它不再有1次将其加倍。1-> 2-> 4-> 8等
示例图:
CREATE (a:Basic {name:'a'})
CREATE (b:Basic {name:'b'})
CREATE (c:Basic {name:'c'})
CREATE (a)-[:TO]->(b)
CREATE (a)-[:SO]->(c)
删除先前关系然后添加新关系的查询。(这只是一个简短的示例,实际上它不会添加相同的关系,但是更多的可能将其指向另一个节点)。
MATCH (a:Basic {name:'a'})
WITH a
OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r
WITH a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)
WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c)
如果将创建更改为合并,则可以解决问题,但是当我知道我只是删除了所有关系时,必须合并感到很奇怪。是否有一种方法可以在查询中途更新" A",以反映更改?我想将其保留在一个查询中
您观察到的行为是由于可选的MATCH
子句生成了2行数据的微妙事实,这导致所有后续操作都进行了两次。
迫使DELETE
子句之后只有一行数据,您可以在DELETE
子句之后使用WITH DISTINCT a
(而不是WITH a
),因此可以:
MATCH (a:Basic {name:'a'})
OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r
WITH DISTINCT a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)
WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c)