可以使用
按类型排除单一关系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
答案 0 :(得分:11)
当然,你可以做到。像这样:
Match (n:Person)-[r*2..4]-(h:Hobby)
where NONE( rel in r WHERE type(rel)="FRIENDS")
return n,r,h
您的查询不起作用,因为对于多级路径,您的r
是一组关系而不是一个关系。因此,您可以使用the predicates on collections中的任何一个来进行所需的过滤。
在这里,我选择了NONE
类型(rel)= FRIENDS,这意味着只有在没有关系类型为FRIENDS的情况下才能获得结果。但您可能希望使用ANY或ALL,具体取决于您的查询的含义。
无论如何,这里的要点是使用谓词函数将事物集合转换为单个布尔值。
答案 1 :(得分:4)
您可以使用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
。