我是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]
但这似乎是错误的方式来获得不是朋友的朋友之友。
建议?
答案 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;