Cypher查询以排除基于关系类型的结果
问题描述:
我是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]
但是,这似乎是错误的方式去获得谁是不是也是朋友的朋友的朋友。
对此提出建议?
答
可以筛选基础上,WHERE
子句中现有的关系,当然你可以用NOT
否定任何条件:
START me=node(0)
MATCH me-[r:fof]->fof
WHERE NOT(me-[:friend]->fof)
and ... [other filters]
答
为什么使用两种关系类型:朋友和FOF?你可以使用一个关系(即朋友)模拟整个朋友图形,然后按深度过滤,如MATCH(我) - [:朋友* 2 ..] - >(朋友),这是朋友的任何级别的深度或MATCH(我) - [:朋友* 2..2] - >(朋友)只是朋友的朋友
答
这只是一个信息答案,因为答案已经由@ 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
这是最简单的,并在最短的处理时间的结果。谢谢! – 2013-03-12 21:23:12