Neo4j Cypher - 在密码查询中按类型排除关系?

时间:2015-07-31 12:22:56

标签: neo4j cypher

可以使用

按类型排除单一关系
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 个答案:

答案 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)

您可以使用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