0

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

该图由朋友 ( me-[friend]-person ) 和朋友的朋友关系 ( me-[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]

但这似乎是获取不是朋友的朋友的错误方法。

建议?

4

3 回答 3

9

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

START me=node(0)           
MATCH me-[r:fof]->fof
WHERE NOT(me-[:friend]->fof)
and ... [other filters]
于 2013-03-10T21:38:13.957 回答
3

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

于 2013-03-11T04:00:09.167 回答
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;
于 2013-03-11T08:15:33.937 回答