2014-08-27 84 views
2

此(newbe-)問題基於官方getting started with neo4j online-tutorial中提供的數據庫。neo4j羣與不同終點的關係

我的目標是創建一個查詢,列出所有連接到以上的兩部電影的人。 數據庫由人和電影類型的節點組成。節點通過「ACTED_IN」,「DIRECTED」,「WROTE」或「PRODUCED」等關係進行關聯。

該數據庫指出,吉恩哈克曼在三部不同的電影中扮演角色,而卡梅隆克羅則導演,製作並編寫了一部電影。所以Cameron與單個電影有三種關係,而Gene則與三種不同的電影相關。存在更多節點和連接。

我當前的查詢去如下:

match (p:Person)-[r]->(m:Movie) with p, count(r) as rel where rel > 2 return p;

這將返回:

  • 吉恩·哈克曼
  • 湯姆·克魯斯
  • 金馬倫克洛

基因和湯姆每人都在三部不同的電影中演出,所以這是正確的。 如上所述,卡梅隆的所有關係都轉到了同一部電影中,這不是我的意圖。查詢不應該返回這個列表中的Cameron,而只是前兩個人。很明顯,我可以通過「ACTED_IN」關係走,但我也想列出不是演員的人,例如,一位撰寫三部或更多部分單獨電影的作者。

另一個查詢我雖然的是:

match (m:Movie)<-[ra]-(p:Person)-[rb]->(b:Movie) ...

不幸的是,這限制連接數恰好是兩個。

在計算人物和電影之間的關係時,是否可以調整第一個查詢的方式是隻包含不同的電影?

回答

0

下面是一個查詢,可以做你正在尋找的東西。

MATCH (p:Person)--(m:Movie) 
WITH p, collect(DISTINCT m) AS ms 
WHERE LENGTH(ms) > 2 
RETURN p 

你不關心關係類型,所以不用擔心。如果不同電影的數量大於您的閾值,您會爲每個人收集不同的電影並返回該人。

恩惠,平安,

吉姆

+0

優雅的解決方案,工作,似乎更少的CPU昂貴。 – 2014-08-28 07:47:22

1

嘗試此查詢:

match (p:Person)-[r]->(m:Movie) 
with p, count(r) as rel, count(distinct(endNode(r))) as q 
where rel > 2 and q = 1 return p; 

它的作用是提取的關係結束節點。你想要的只是一部這樣的電影,擺脫卡梅隆克勞的問題。

+0

它的工作原理,如果你改變最後一行: '那裏相對> 2和Q!= 1返回p;' 'q = 1'只返回Cameron,因爲他只有一個截然不同的endnode(我假設) 'q!= 1'返回其他兩個actor。 – 2014-08-28 07:41:07