2013-06-05 24 views
1

在像應用一個Twitter,我想獲得僅最後3個USERS具有PUBLISH特定HASHTAG鳴叫(A,B,C,d,E)如何在不限制全局查詢的情況下獲取COLLECT的第一個元素?

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

回答

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)當條件爲真和一個空列表時條件爲假

補充說,結果到累加器reduce建立起名單增量

+0

這工作完全!!聽起來像magick - 謝謝! –

0

小心返回與元素的列表,新濾波器語法是:

濾波器(X IN a.array WHERE長度(X)= 3)

相關問題