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

may*_*pta 11 neo4j cypher

可以使用类型排除单个关系

Match (n:Person)-[r]-(m:Person) where type(r)<>"FRIENDS" return n,r,m
Run Code Online (Sandbox Code Playgroud)

有没有办法排除与cypher的多级关系?

Match (n:Person)-[r*2..4]-(h:Hobby) where type(r)<>"FRIENDS" return n,r,h
Run Code Online (Sandbox Code Playgroud)

Fro*_*its 15

当然,你可以做到这一点.像这样:

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

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

在这里,我选择NONE了type(rel)= FRIENDS,这意味着如果NONE的关系属于FRIENDS类型,你只会得到结果.但您可能会想要使用ANY或ALL,具体取决于您的查询的含义.

无论如何,这里的要点是使用谓词函数将事物集合转换为单个布尔值.


Ste*_*ter 5

您可以为此使用ALLorANY谓词:

MATCH p=(n:Person)-[*2..4]-(h:Hobby) 
WHERE ALL(x in relationships(p) WHERE type(x) <> "FRIENDS")
RETURN n,r,h
Run Code Online (Sandbox Code Playgroud)

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