如何在不限制全局查询的情况下获取COLLECT的第一个元素?

时间:2013-06-05 07:27:58

标签: neo4j

在类似Twitter的应用程序中,我想只获得最后一个用于特定HASHTAG(A,B,C,D,E)发布推文的3个USERS

START me=node(X), hashtag=node(A,B,C,D,E)
MATCH n-[USED_IN]->tweet<-[p:PUBLISH]-user-[FRIEND_OF]->me
WITH p.date? AS date,hashtag,user ORDER BY date DESC
WITH hashtag, COLLECT(user.name) AS users
RETURN hashtag._id, users;

这是我通过此查询得到的结果。这很好,但如果朋友列表很大,我可以在第二列中有一个非常大的数组。

+-------------------------------------------+
| hashtag   | users                         |
+-------------------------------------------+
| "paradis" | ["Alexandre","Paul"]          |
| "hello"   | ["Paul"]                      |
| "public"  | ["Alexandre"]                 |
+-------------------------------------------+

如果我添加LIMIT子句,则在查询结束时,整个结果集都是有限的。

因为用户可以拥有大量的朋友,所以我不想取回所有这些用户,而只想回复那些在这些主题标签中发布的2或3

使用filter / reduce的任何解决方案都能达到我的预期吗?

运行neo4j 1.8.2

2 个答案:

答案 0 :(得分:3)

将开始访问子集合,

同时您可以使用此解决方法:http://console.neo4j.org/r/f7lmtk

start n=node(*) 
where has(n.name) 
with collect(n.name) as names 
return reduce(a=[], x in names : a + filter(y in [x] : length(a)<2)) as two_names

Reduce用于在聚合器中构建结果列表 并使用filter代替仅在2.0

中可用的条件case ... when ...

filter(y in [x] : length(a)<2)在条件为true时返回包含元素的列表,在条件为false时返回空列表

将结果添加到累加器reduce以递增方式构建列表

答案 1 :(得分:0)

请注意,新的过滤器语法为:

过滤器(x IN a.array WHERE length(x)= 3)