删除关系,然后添加回节点neo4j

时间:2019-02-19 20:58:37

标签: neo4j cypher

我想要一个节点,删除某种类型的所有传出关系,然后再添加回关系。

我的问题是,一旦我抓住该节点,即使删除后它仍然保持以前的关系,因此它不再是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) 

如果我将CREATE更改为MERGE,那么它可以解决问题,但是当我知道我刚刚删除了所有关系时,不得不合并很奇怪。有没有一种方法可以在查询过程中更新“ a”,使其反映更改?我想将其保存在一个查询中

1 个答案:

答案 0 :(得分:1)

您观察到的行为是由于一个微妙的事实,即OPTIONAL MATCH子句生成了两行数据,这导致所有后续操作都要执行两次。

要强制在DELETE子句之后仅包含一行数据,可以在WITH DISTINCT a子句后使用WITH a(而不是DELETE),像这样:

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)