我使用下面的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'。
答案 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子句和这样的模式,因为我们区分u
和t
变量,它永远不会与t
匹配u
。
如果你想要一个速记版本(前提是:Book节点是唯一的东西:用户可以:REVIEW,并且:用户是唯一可以:REVIEW:Books的节点类型),那么你可以缩短到:
MATCH (u:User{id:15})-[:REVIEW*2]-(t:User)
RETURN distinct t