2012-06-25 107 views
0

Neo4j中有一種方法可以使用cypher或gremlin來返回它們之間具有一組公共節點的節點列表嗎?通過一組公共節點連接的返回節點

一個例子是

Person1-[KNOWS]->Friend1 
Person1-[KNOWS]->Friend2 
Person1-[KNOWS]->Friend3 

Person2-[HATES]->Friend2 
Person2-[HATES]->Friend3 

我要開始爲Person1,說:「找我,誰恨所有我認識的人的人」,這應該返回Person2因爲Person1知道Friend2,Friend3Person2Friend2,Friend3

我已經找到了連接開始,

START 
    person=node(1) 
MATCH 
    person-[KNOWS]->friend<-[HATES]-enemy 
RETURN 
    enemy 

,但我似乎無法找到一種方式來表達它使得人有恨各界朋友。

這可以在Cypher中完成嗎?

回答

1

語法應爲,但我不能擺脫掉聚集的錯誤消息

START 
    person=node(1) 
MATCH 
    person-[r1:KNOWS]->friend<-[r2:HATES]-enemy 
WHERE 
    count(distinct r1)=count(distinct r2) 
RETURN 
    enemy 

編輯:這也許是接近:

START 
    person=node(1) 
MATCH 
    person-[r1:KNOWS]->friend<-[r2:HATES]-enemy, person-[r3?:KNOWS]-enemy 
WITH 
    person, enemy, count(distinct r1) as rk1, count(distinct r2) as rk2,r3 
WHERE 
    r3 is null 
    AND 
    r1=r2 
RETURN 
    enemy 
+0

這是近乎完美。不幸的是,它不會返回正確的結果,因爲'r1'是'KNOWS'關係,'r2'是'HATES'關係。 – Nicholas

+0

這並不重要,因爲討厭所有朋友的人必須具有相同數量(數量)的HATE類型的關係類型知識。因此,比較計數(r1)和計數(r2)應該是一個合適的等式。 – ulkas

相關問題