假设有Person
和Car
个节点。
我希望在同一个密码查询中删除所有关系APerson-[:OWNS]-SomeCar
并插入新关系。
基本上我曾尝试过这个查询:
MATCH (p:Person {_id: {personId}})
WITH p
MATCH (c:Car)
WITH p, c
MATCH p-[r:OWNS]->c
DELETE r //deleting all "old" relationships
WITH c //a with is expected here by cypher syntax => dummy value that shouldn't impact the remaining of the query
MATCH (p:Person {_id: {personId}}), (c:Car)
WHERE c._id IN {cars}
WITH p, c
MERGE p-[:OWNS]->c //merge new ones
传递给查询的参数:cars
和personId
。
然而,结果是没有添加新的关系。 好像删除发生在合并之后,因此完全删除所有关系。
在同一个查询中有什么办法吗?
答案 0 :(得分:6)
[增订]
此查询是否符合您的要求?
MATCH (p:Person {_id: {personId}})
OPTIONAL MATCH (p)-[r:OWNS]->(:Car)
DELETE r
WITH p
MATCH (c:Car)
WHERE c._id IN {cars}
MERGE p-[:OWNS]->c;
此查询使用OPTIONAL MATCH
允许处理整个查询,即使没有现有的OWNS
关系也是如此。 (如果未能找到匹配项,则非可选MATCH
子句将中止整个查询。)
它还会重新使用匹配的Person
节点来避免第二次匹配尝试。
此外,我的查询指定了唯一必需的WITH
子句。 write子句(如DELETE
)不能跟read子句(如MATCH
)后面,除非它们之间有WITH
子句。