我想写一个查询;
实际上,这是允许一个程序的用户“阻止”该程序的另一位用户,而不管这两个用户以前是否有某种关系(可以有任何数量)。 对于查询的一半,可以选择返回一个关系(如果存在);
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
有人可以在这里指出我的错误并指出正确的方向吗?
答案 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