2013-03-10 89 views
0

我是Cypher的新手,我試圖弄清楚如何在某些情況下從查詢中排除節點。Cypher查詢以排除基於關係類型的結果

該圖由朋友(我 - [朋友] -person)和交友的,朋友關係(我 - [FOF] -person)

我需要找到朋友關係的所有朋友(很容易的),但不包括誰也都是朋友的朋友的朋友「

我想我可以這樣做:

START me=node(0)   
MATCH me-[r:fof]->fof, me-[f?:friend]->fof   
WHERE f is null and NOT(r is null) 
and ... [other filters] 

但是,這似乎是錯誤的方式去獲得誰是不是也是朋友的朋友的朋友。

對此提出建議?

回答

9

可以篩選基礎上,WHERE子句中現有的關係,當然你可以用NOT否定任何條件:

START me=node(0)   
MATCH me-[r:fof]->fof 
WHERE NOT(me-[:friend]->fof) 
and ... [other filters] 
+0

這是最簡單的,並在最短的處理時間的結果。謝謝! – 2013-03-12 21:23:12

2

爲什麼使用兩種關係類型:朋友和FOF?你可以使用一個關係(即朋友)模擬整個朋友圖形,然後按深度過濾,如MATCH(我) - [:朋友* 2 ..] - >(朋友),這是朋友的任何級別的深度或MATCH(我) - [:朋友* 2..2] - >(朋友)只是朋友的朋友

+0

也許速度很重要。 – ulkas 2013-03-11 08:11:13

+0

我有朋友關係的屬性,我需要過濾/訂購。我沒有看到一種方法來做到這一點與兩個節點之間的任何程度的分離〜但我很想在這一個被證明是錯誤的:) – 2013-03-12 21:24:17

+1

嗯,你需要什麼屬性和過濾/排序? – Luanne 2013-03-14 03:41:49

0

這只是一個信息答案,因爲答案已經由@ ean5533提供。

如果速度真的很重要,你可以嘗試創建一個新的關係型fof2所有情況下,如果你是真正的朋友的朋友,但不是直接的朋友:

start n=node(*) 
match n-[:fof]-friend 
where not(n-[:friend]-friend) 
create unique n-[:fof2]-friend; 

不是查詢真正奇怪的朋友的朋友會更快:

start n=node(0) 
match p=n-[:fof2]-friend 
return p; 
+0

有趣。雖然我同意@ ean5533的答案解決了即時問題,並且不需要維護另一種關係類型。 – 2013-03-12 21:26:42