Neo4j Cypher - 如何在Cypher查询中排除指定类型的关系?

14

可以通过类型排除单个关系

Match (n:Person)-[r]-(m:Person) where type(r)<>"FRIENDS" return n,r,m

有没有一种方法可以在Cypher中排除多层关系?

Match (n:Person)-[r*2..4]-(h:Hobby) where type(r)<>"FRIENDS" return n,r,h
2个回答

21

当然,您可以这样做。像这样:

Match (n:Person)-[r*2..4]-(h:Hobby) 
where NONE( rel in r WHERE type(rel)="FRIENDS") 
return n,r,h

您的查询不起作用,因为使用多级路径时,您的r是一组关系而不是单个关系。因此,您可以使用任何适用于集合的谓词来执行所需的过滤。

在这里,我选择了NONE和type(rel)= FRIENDS,这意味着只有当没有一个关系是FRIENDS类型时,您才会得到结果。但是,根据您查询的含义,您可能需要使用ANY或ALL。

无论如何,这里的主要观点是使用谓词函数将一组事物转换为一个布尔值。


1
啊,你比我快了10秒钟 :-) - Stefan Armbruster
1
很有趣看到这两种不同的表述方式,当然还有许多等效的方法来完成同样的事情! - FrobberOfBits
如果只有一个,这种方法就不起作用了。似乎需要至少两个元素才能将 r 定义为列表。那么,如果是一个或多个类型的关系链,你会怎么做? - MrE

6
您可以使用 ALLANY 谓词来实现此操作:
MATCH p=(n:Person)-[*2..4]-(h:Hobby) 
WHERE ALL(x in relationships(p) WHERE type(x) <> "FRIENDS")
RETURN n,r,h

使用ALL谓词确保沿该路径的每个关系都不是FRIEND。使用ANY确保您至少有一个不是FRIEND的关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接