删除旧关系并在同一查询中使用相同标签创建新关系

Mik*_*378 3 neo4j cypher

我们假设PersonCar节点.

我希望在同一个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)

传递给查询的参数: carspersonId.

但是,它没有添加新的关系.好像在合并后发生删除,因此完全删除所有关系.

有什么办法在同一个查询中做到这一点?

cyb*_*sam 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;
Run Code Online (Sandbox Code Playgroud)

此查询用于OPTIONAL MATCH允许处理整个查询,即使没有现有OWNS关系也是如此.(MATCH如果无法找到匹配项,则非可选子句将中止整个查询.)

它还重新使用匹配的Person节点以避免第二次匹配尝试.

另外,我的查询指定了唯一的必需WITH子句.除非在它们之间有一个子句,否则write子句(如DELETE)不能跟随read子句(如MATCH)WITH.