如果存在两个节点,则更新两个节点之间的关系;如果不存在,则创建一个新的关系NEO4j

时间:2018-10-10 21:12:20

标签: neo4j cypher

我想写一个查询;

  • 更新两个节点之间的关系(如果已经存在),或者
  • 如果不存在关系,则在两个节点之间创建一个。

实际上,这是允许一个程序的用户“阻止”该程序的另一位用户,而不管这两个用户以前是否有某种关系(可以有任何数量)。 对于查询的一半,可以选择返回一个关系(如果存在);

MATCH (a:user {name: {aParam}) 
OPTIONAL MATCH (a) -[r]- (b:user {name: {bParam}) 
RETURN type(r), a

对于查询的另一半,更新两个节点之间的关系(假设已经存在);

MATCH (a:user {name: {aParam}) <- [r:originalRelationship] - (b:user {name: {bParam})
WITH a, r, b
MERGE (a) - [:updatedRelationship] - (b)
WITH r
DELETE r

但是将我还没有的两个例子结合起来,我试图将它们结合在一起,但是弗兰肯斯坦却没有成为现实;

MATCH (a:user {name: {aParam})
OPTIONAL MATCH (a) - [r] - (b:user {name: {bParam})
WITH a, b, r
MERGE (a) - [:block] -> (b)
WITH r
DELETE r

有人可以在这里指出我的错误并指出正确的方向吗?

1 个答案:

答案 0 :(得分:1)

由于您涉及多个关系,并且想要删除所有现有关系并将其替换为“已阻止”,因此可以尝试以下操作:

Match (p1:Person{name:"hj"}),(p2:Person{name:"bg"})
OPTIONAL Match (p1)-[r]->(p2) where TYPE(r)<>"Blocked"
MERGE (p1)-[:Blocked{blocked: True}]->(p2)
DELETE r
return *

保留下面的内容以防他人受到帮助。如果只有一种类型的关系,并且只想更新值,则可以使用以下方法:

您可以将 Merge 子句与 ON MATCH ON CREATE 选项一起使用。

由于您尚未明确指定节点和关系结构,因此我将举另一个例子。 考虑2个Person节点,其中“名称”字段唯一标识该人。

查询将创建关系(如果不存在),并且如果已经存在,则可以指定要更新的字段。

Match (p1:Person{name:"hj"}),(p2:Person{name:"bg"})
Merge (p1)-[r:originalRelationship]->(p2)
ON CREATE SET r.created = True
ON MATCH SET r.updated = True
return p1,p2,r