从Neo4J中的MATCH查询中排除一些返回的结果

时间:2017-04-26 01:57:57

标签: neo4j cypher

我使用下面的MATCH查询(参考用户查看书籍):

MATCH (u:User {id:15})-[r:REVIEW]->(b:Book)
WITH u,b
MATCH (t:User)-[r:REVIEW]->(b)
RETURN distinct t

此cypher首先匹配id = 15的用户审阅的书籍。然后,它使用另一个MATCH命令查找已审阅任何已由id = 15的用户审阅的书籍的其他用户。但是,返回的用户也包括id = 15的用户。我怎么能排除他?

请注意,我使用了“不同的”字样。命令,以便我不会让同一个用户2次或更多次。 F.E.如果用户(id = 15)已经审核了2本书,而另一位用户也审阅了这2本书,那么我将获得最后一位用户2次没有' distinct'。

2 个答案:

答案 0 :(得分:2)

您只需要在第二个匹配项中添加一个where子句,该匹配项将排除与匹配的第一个用户相同的用户。

MATCH (u:User{id:15})-[r:REVIEW]->(b:Book)
with u,b
MATCH (t:User)-[r:REVIEW]->(b)
WHERE t <> u
RETURN distinct t

答案 1 :(得分:2)

另一个选择是在单个模式中捕获您想要的内容,如下所示:

MATCH (u:User{id:15})-[:REVIEW]->(b:Book)<-[:REVIEW]-(t:User)
RETURN distinct t

如果你有一个MATCH子句和这样的模式,因为我们区分ut变量,它永远不会与t匹配u

如果你想要一个速记版本(前提是:Book节点是唯一的东西:用户可以:REVIEW,并且:用户是唯一可以:REVIEW:Books的节点类型),那么你可以缩短到:

MATCH (u:User{id:15})-[:REVIEW*2]-(t:User)
RETURN distinct t