可以通过类型排除单个关系
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
当然,您可以这样做。像这样:
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。
无论如何,这里的主要观点是使用谓词函数将一组事物转换为一个布尔值。
ALL
或 ANY
谓词来实现此操作: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
的关系。
r
定义为列表。那么,如果是一个或多个类型的关系链,你会怎么做? - MrE