可以说我有一些用户节点和FOLLOWS
其他节点。我想加载所有用户的列表,以及他们关注的完整列表,并过滤该列表以仅获取关注某些特定节点的用户。这样做的正确方法是什么?
我的第一次尝试是:
START n=node(*)
MATCH n-[:FOLLOWS]->following
WHERE following.name='John'
RETURN n, COLLECT(following)
这显然不起作用,因为除了 John 之外,所有关注的用户都被过滤掉了,所以 COLLECT() 总是只有那个用户。
我的下一次尝试是两次加载相关节点:
START n=node(*)
MATCH n-[:FOLLOWS]->following_filter
, n-[:FOLLOWS]->following_all
WHERE following_filter.name='John'
RETURN n, COLLECT(following_all)
起初这似乎运作良好,但当我添加另一个 MATCH 子句时,我开始再次获得部分关注用户列表。知道为什么会这样吗?
另一个似乎运作良好的可能解决方案是使用WITH
and ANY
:
START n=node(*)
MATCH n-[:FOLLOWS]->following
WITH n, COLLECT(following) AS following
WHERE ANY(x in following WHERE x.name='John')
RETURN n, COLLECT(following)
但是,我更喜欢暂时避免使用WITH
并找到另一种解决方案。我正在使用我编写的尚未支持的查询生成器WITH
生成这些查询,并且需要进行一些架构更改来添加对它的支持,这需要一些时间。我确实意识到这不是一个很好的避免的理由WITH
,我最终会为此添加支持 - 但我真的更喜欢现在让一些东西工作并在必要时稍后更改它。
我也可以将该模式用作 WHERE 子句:
START n=node(*), john=node(888)
MATCH n-[:FOLLOWS]->following
WHERE n-[:FOLLOWS]->john
RETURN n, COLLECT(following)
但似乎我只能使用 ID 或 lucene 索引加载我的“John”节点,而失去了 Cypher WHERE 的全部表达能力。