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

Ara*_*and 4 neo4j cypher

我有一个时间轴类型查询,用于检索帖子以及"喜欢"帖子的用户.

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; 
Run Code Online (Sandbox Code Playgroud)

我将检索到的帖子数量限制为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; 
Run Code Online (Sandbox Code Playgroud)

要么:

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; 
Run Code Online (Sandbox Code Playgroud)

这会将每个帖子的返回者的数量限制为6.如何实现这一目标?

Eve*_*man 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;
Run Code Online (Sandbox Code Playgroud)

未经测试的代码.希望它有效 - 下次在控制台中为我们建立样本,以便我们可以玩.:)


小智 5

在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节点,每个n节点在集合中每个具有0至10个相关节点。