我们假设Person和Car节点.
我希望在同一个cypher查询中删除所有关系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
Run Code Online (Sandbox Code Playgroud)
传递给查询的参数: cars和personId.
但是,它没有添加新的关系.好像在合并后发生删除,因此完全删除所有关系.
有什么办法在同一个查询中做到这一点?
[更新]
这个查询是否符合您的要求?
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;
Run Code Online (Sandbox Code Playgroud)
此查询用于OPTIONAL MATCH允许处理整个查询,即使没有现有OWNS关系也是如此.(MATCH如果无法找到匹配项,则非可选子句将中止整个查询.)
它还重新使用匹配的Person节点以避免第二次匹配尝试.
另外,我的查询指定了唯一的必需WITH子句.除非在它们之间有一个子句,否则write子句(如DELETE)不能跟随read子句(如MATCH)WITH.