2017-04-26 104 views
3

我使用匹配查询下面(指的用户审查书):排除了一些返回从匹配查询结果的Neo4j

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

这暗号首先通过与ID = 15的用户评论的书籍相匹配。然后它使用另一个MATCH命令来查找任何其他用户,该用户查看了用户已经通过ID = 15查看的任何图书。但是,返回的用户也包括id = 15的用户。我如何排除他?

请注意,我使用了'distinct'命令,以便我不会得到相同的用户2次或更多次。 F.E.如果用户(id = 15)已经审阅了2本书,并且另一个用户也审阅了这两本书,那么我会在没有“独特”的情况下获得最后一个用户2次。

回答

2

另一种选择是捕捉到你想要的东西在一个单一的模式,就像这样:

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

当你有这样一个MATCH子句和模式,因为我们区分ut变量,它永远不会匹配tu

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

MATCH (u:User{id:15})-[:REVIEW*2]-(t:User) 
RETURN distinct t 
+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 
+0

这两个答案都很完美!谢谢。由于新帐户,我无法调高他们。 –