Neo4j Cypher:使用LIMIT和COLLECT(或在同一查询中两次使用LIMIT)

6

我有一个时间线类型的查询,用于检索帖子和点赞帖子的用户。

START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend
WITH myfriend
MATCH myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WHERE myfriend <> statusupdates
RETURN distinct statusupdates, FILTER (x in collect(distinct likers) : x <> null), myfriend
ORDER BY statusupdates.PostTime DESC
LIMIT 25; 

我将检索到的帖子数量限制为25。我还想限制喜欢帖子的用户人数。是否有办法在查询中使用多个限制子句? 理想情况下,我想这样做:

START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend
WITH myfriendMATCH myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WHERE myfriend <> statusupdates
RETURN distinct statusupdates, LIMIT FILTER (x in collect(distinct likers) : x <> null) 6, myfriend
ORDER BY statusupdates.PostTime DESC
LIMIT 25; 

或者:

START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend
WITH myfriendMATCH myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WHERE myfriend <> statusupdates
RETURN distinct statusupdates, FILTER (x in collect(distinct likers) : x <> null), myfriend
LIMIT likers 6
ORDER BY statusupdates.PostTime DESC
LIMIT 25; 

如何限制每个帖子返回的点赞者数量为6个?我该如何实现这个功能?

2个回答

9
限制点赞者的问题在于它位于查询的另一端,因此无法进行优化。你基本上必须进行两次匹配。此外,在WITH之后的LIMIT仅适用于1.9.M01版本。
所以,我认为这样做可以达到你想要的效果:
START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WITH distinct likers
// you can also order by something here, if you want.
LIMIT 6
START me=node:node_auto_index(UserIdentifier='USER0')
// at this point, likers is already bound, so it's limited to the 6
MATCH me-[rels:FOLLOWS*0..1]-myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
RETURN distinct statusupdates, likers, myfriend
ORDER BY statusupdates.postTime
LIMIT 25;

未测试的代码。希望它可以正常工作--下次请在控制台中为我们构建一个示例,以便我们可以进行测试和实验。:)


谢谢Wes。所以如果我理解正确,With实际上是一个伪返回语句。非常酷。你提到的控制台是什么?(以及如何使用它的说明) - Aran Mulholland
http://console.neo4j.org -- 不需要太多的说明。 :) 您可以使用Cypher构建图形,然后单击右上角的“共享”选项,保存图形并发布。 - Eve Freeman
是的,我需要写一篇关于WITH的博客文章。在理解它的工作原理之前,它很令人困惑。它基本上强制查询完成并返回结果,然后您可以在下一个查询中使用这些结果。应该适度使用,但几乎所有复杂的查询似乎都需要它。 :) - Eve Freeman
在v1.9中功能良好,在我手头的1.8RC版本中无法工作,将会检查最终的1.8版本。 - Aran Mulholland
正如我在答案中提到的,你需要1.9才能做到这一点。 - Eve Freeman

9
在Neo4j 2.0中,您可以使用集合切片。也就是说,您可以执行类似于以下查询:
MATCH (n)-[r*0..1]-(x) RETURN n, LABELS(n), COLLECT([x,id(x),LABELS(x),r])[0..10] LIMIT 5
以上示例将返回最多5个n节点,每个节点的集合中有0到10个相关节点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接