2012-06-25 69 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

相关问题