2014-07-22 100 views
0

我試圖在給定的neo4j測試數據集中找到'朋友的朋友'級別推薦, ,我想出了這兩個查詢,並且我無法識別第二個查詢中的錯誤,因爲它包含一個額外的節點 - '8'(Emil Eifrem)。 請幫我理解其中的差異。由於neo4j Cypher查詢說明結果

1)

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->()<-[:ACTED_IN]-(f), 
    (f)-[:ACTED_IN]->()<-[:ACTED_IN]-(fof) 
WHERE NOT (keanu)-[:ACTED_IN]->()<-[:ACTED_IN]-(fof) AND fof <> keanu 
RETURN fof; 

VS

2)

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(movie)<-[:ACTED_IN]-(f), 
    (f)-[:ACTED_IN]->(f_movies)<-[:ACTED_IN]-(fof) 
WHERE NOT (movie)<-[:ACTED_IN]-(fof) AND fof <> keanu 
RETURN fof; 
+0

版本:Neo4j 2.1.2 – user3865770

+0

我沒有樣本數據在我面前。 Emil和Keanu都有一些電影嗎?你的WHERE條款之間的一個區別是,第一個不包括任何與Keanu一起作用於任何事物的「foaf」,而第二個不包括任何只用Keanu在電影中扮演的「foaf」。 (如果'(電影)'有多個結果,那麼'foaf'的_one_將第二個查詢中的條件傳遞給結果就足夠了:或者換句話說,演員可以匹配'foaf'幾次,只有不符合條件的情況才被排除。) – jjaderberg

回答

1

你指的是在第二個WHERE子句是那是比賽子句中匹配一個具體影片的影片之前,所以你只能檢查這部電影,而不是所有可能的電影和基努裏維斯之間的電影。這就是爲什麼你篩選出更少的人。