0

可以说我有一些用户节点和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 子句时,我开始再次获得部分关注用户列表。知道为什么会这样吗?


另一个似乎运作良好的可能解决方案是使用WITHand 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 的全部表达能力。

4

1 回答 1

1
START n=node(*)
MATCH following_all<-[:FOLLOWS]-n-[:FOLLOWS]->following_filter
WHERE following_filter.name='John'
RETURN n, COLLECT(following_all)
于 2013-07-07T07:12:22.597 回答