1

在类似推特的应用程序中,我只想获得最后 3 个用户,他们发布了特定 HASHTAG 的推文(A、B、C、D、E)

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 个

任何带有过滤器/减少的解决方案可以达到我的期望吗?

运行 neo4j 1.8.2

4

2 回答 2

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用于代替case ... when ...仅在 2.0 中可用的条件

filter(y in [x] : length(a)<2)当条件为真时返回一个包含元素的列表,当条件为假时返回一个空列表

将该结果添加到累加器中,reduce逐步建立列表

于 2013-06-05T09:20:27.427 回答
0

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

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

于 2014-06-18T13:29:53.807 回答