Cypher查询根据关系类型排除结果

时间:2013-03-10 20:33:11

标签: neo4j cypher

我是Cypher的新手,正在尝试弄清楚如何在某些情况下从查询中排除节点。

图表由朋友(我 - [朋友] - 人)和朋友关系(我 - [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]

但这似乎是错误的方式来获得不是朋友的朋友之友。

建议?

3 个答案:

答案 0 :(得分:9)

您可以根据WHERE子句中的现有关系进行过滤,当然您可以使用NOT来否定任何条件:

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

答案 1 :(得分:2)

为什么要使用两种关系类型:friend和fof?您可以使用一个关系(即朋友)对整个朋友图进行建模,然后按深度过滤,如MATCH(我) - [:friend * 2 ..] - >(朋友),这是任何级别的朋友或MATCH(我) - [:朋友* 2..2] - >(朋友)仅为朋友的朋友

答案 2 :(得分: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;