2017-04-26 102 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

這兩個答案都很完美!謝謝。由於新帳戶,我無法調高他們。 –