2016-12-06 31 views
0

我想用neo4j選擇用戶,他們觀看的動作片的數量以及由Roland Emmerich指導的每個用戶的動作電影數量。Neo4j獨立選擇幾個比賽條款

我以各種形式嘗試此查詢:

match (u:User)-[:watched]->(m:Movie)-[belongs_to]->  
(Category{category_name:"Action"}) with count(m) as actionMovies, u 
match (m:Movie)<-[directed]-(Director{director_name:"Roland Emmerich"}) 
return u, count(m) as MoviesFromRE, actionMovies 

但查詢執行永遠不會完成。所以我假設我正在做一些交叉連接。

實際上,我希望第一次計數獨立於第二次,因爲當編譯器進入第二個匹配子句時,它已經計算出來了。

下面是相關數據庫視圖

Overview of used database (Movies)

感謝您的任何建議和幫助

好擺脫錯別字以及包括電影與條款後:

match (u:User)-[:watched]->(m:Movie)-[:belongs_to]->  
(:Category{category_name:"Action"}) with count(m) as actionMovies, u, m 
match (m)<-[:directed]-(:Director{director_name:"Roland Emmerich"}) 
return u, count(m) as MoviesFromRE, actionMovies order by u.user_name 

現在我得到的動作電影始終是1.我認爲它是因爲我現在先與電影條款進行分組。我認爲我需要一種方法將電影從第一個條目移到第二個條目,但不要將他們的第一個結果分組。

+0

您在查詢中有一些奇怪的事情,不知道如果在這裏粘貼時,他們是錯別字,或者如果他們在存在查詢您正在嘗試運行。請記住,關係類型前面有':',但是查詢中的'belongs_to'和'directed'不是,這意味着它們是與任何類型關係匹配的變量。同樣,查詢中的「Director」不是標籤(不是':'),所以它是一個變量,它與'director_name'屬性設置爲「Roland Emmerich」的任何節點相匹配。與'Category'類似。 – InverseFalcon

+0

另外,你的第二場比賽與你的第一場比賽完全脫節。假設關係和導演節點已經固定,因此它們不是變量,那麼您需要獲得Roland Emmerich指導的所有電影,並且這與用戶觀看的電影沒有任何關係,但對於電影的數量將保持不變羅蘭艾默裏奇執導。這是因爲「m」變量綁定到:Movies與您的第一個匹配不是一樣的「m」(它不會保留在您的WITH中) – InverseFalcon

+0

@InverseFalcon我擺脫了我的拼寫錯誤併發布了帶有您的建議的新代碼的條款。可悲的是我得到一個錯誤的結果,因爲動作電影現在總是1 – dbmongo

回答

2

你總是actionMovies得到1的原因是本條款中:

WITH COUNT(m) AS actionMovies, u, m 

第跟它(部分):「算m節點的數量爲每個唯一對um節點」。這計數必須始終爲1

此查詢應該更好的工作:

MATCH (u:User)-[:watched]->(am:Movie)-[:belongs_to]->(:Category{category_name:"Action"}) 
WITH u, COLLECT(am) AS ams 
UNWIND ams AS m 
OPTIONAL MATCH (m)<-[dir:directed]-(:Director{director_name:"Roland Emmerich"}) 
RETURN u, COUNT(dir) AS MoviesFromRE, SIZE(ams) AS actionMovies 
ORDER BY u.user_name; 
+1

我認爲可選MATCH可能會拋出你的COUNT(m)在返回,因爲它不會影響行數。我想你需要做一些調整才能讓這個工作。 – InverseFalcon

+0

@InverseFalcon好的。非常微妙。從第二個「MATCH」中刪除了「OPTIONAL」。 – cybersam

+1

實際上,我不確定這是否也能起作用。因爲它現在是一個MATCH,它將消除不是由Roland Emmerich指導的電影的行,所以任何沒有觀看這些Roland Emmerich導演的電影的用戶都不會出現在結果集中。也許消除MATCH並使用'SIZE((m)< - [:directed] - (:Director {director_name:「Roland Emmerich」}))'。或者,FILTER可能會對查詢進行一些更改。 – InverseFalcon