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

时间:2015-11-04 01:32:10

标签: neo4j cypher

假设有PersonCar个节点。

我希望在同一个密码查询中删除所有关系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

传递给查询的参数:carspersonId

然而,结果是没有添加新的关系。 好像删除发生在合并之后,因此完全删除所有关系。

在同一个查询中有什么办法吗?

1 个答案:

答案 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子句。