2013-03-10 44 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