Benjamin Mosnier
Benjamin Mosnier

Reputation: 13

How to get the first elements of COLLECT whithout limiting the global query?

In a twitter like app, I would like to get only the 3 last USERS which has PUBLISH a tweet for particular 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;

This is the result I get with this query. This is good but if the friend list is big, I could have a very large array in the second column.

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

If I add a LIMIT clause, at the end of the query, the entire result set is limited.

Because a user can have a very large number of friends, I do not want to get back all those USER, but only the last 2 or 3 which has published in those hashtags

Is the any solution with filter/reduce to get what I expect?

Running neo4j 1.8.2

Upvotes: 1

Views: 193

Answers (2)

Mykola Makhynko
Mykola Makhynko

Reputation: 113

Be careful, the new filter syntax is:

filter(x IN a.array WHERE length(x)= 3)

Upvotes: 0

Michael Hunger
Michael Hunger

Reputation: 41706

Accessing sub-collection will be worked on,

meanwhile you can use this workaround: 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 is used to build up the result list in the aggregator And filter is used instead of the conditional case ... when ... which is only available in 2.0

filter(y in [x] : length(a)<2) returns a list with the element when the condition is true and an empty list when the condition is false

adding that result to the accumulator with reduce builds up the list incrementally

Upvotes: 3

Related Questions