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

时间:2012-11-15 23:34:55

标签: 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; 

我将检索到的帖子数限制为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 个答案:

答案 0 :(得分:8)

限制类似的问题在于它位于查询的另一端,因此无法对其进行优化。你基本上要做两场比赛。此外,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;

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

答案 1 :(得分:4)

在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个相关节点。