2016-12-28 2 views
0

Рассмотрим этот Cypher-запросNeo4j: LIMIT и ORDER BY в COLLECT

MATCH (a : User)-[c : Commented]->(b) RETURN DISTINCT a.username AS 
username, b.postId AS postId, COLLECT({commentBody : c.comments, 
commentedOn : c.time})[0..5] AS commentData LIMIT 20; 

запрос возвращает меня «с», начиная с 1-го и ограничивает его до 5. Как я могу принести последние пять «с», а затем заказать их by commentedOn. Примечание ** подсчет количества отношений между 'a' и 'c' неизвестен, может быть 1 может быть 1000.

То, что я пытаюсь достичь, возвращает до 20 '' узлов с последними последние 5 отношений «c» для этого пути. , например. ваша домашняя страница instagram может содержать 20 сообщений, и каждый из них может иметь много комментариев под одной почтовой коллекцией, не так ли? Я могу достичь до сих пор, я могу собрать первые 5 отношений «c», мой вопрос здесь в том, как мне собрать последние 5 отношений «c», учитывая, что мне нужно сопоставить 20 «а» узлов.

+0

Что является критерием для выбора 20 пользователей? Только 20 пользователей, которые прокомментировали какую-либо запись, и с этими 20 пользователями, получают последние 5 комментариев от каждого из них в любой записи? – InverseFalcon

+0

@InverseFalcon yup –

ответ

0

Если я правильно понял вопрос правильно, вы хотели бы получать последние пять комментариев - т.е. сортировать их по дате (по убыванию) и возьмите верхнюю 5. С помощью WITH к цепи запросов вместе, например:

MATCH (a : User)-[c : Commented]->(b) 
WITH DISTINCT 
    a.username AS username, 
    b.postId AS postId, 
    c.comments AS commentBody, 
    c.time AS commentedOn 
ORDER BY commentedOn DESC 
LIMIT 5 
RETURN 
    username, collect({postId : postId, commentBody : commentBody, commentedOn : commentedOn}) AS commentData 
LIMIT 20 
+0

, который поставил бы предел для всего результата соответствия i-e, если я хочу получать комментарии от 20 пользователей, и каждый из них может иметь n комментариев в качестве отношений, то он терпит неудачу. это даст мне 20 результатов, которые были бы комбинацией пользователей + комментариев. Напр. если один пользователь прокомментировал 30 раз, это отправит мне одного пользователя и 19 его комментариев. Я намерен сделать выборку из 20 пользователей и максимум 5 комментариев от каждого. –

+0

@ RishikRohan, я понимаю это немного больше. Не могли бы вы обновить свой вопрос в сообщении? Что мне до сих пор неясно - какие 20 пользователей вы хотели бы получить? –

+0

обновил заявление о проблеме, дайте мне знать Если вам нужно больше объяснений. –

0

Вы хотите использовать WITH, чтобы вы могли использовать первую часть своего запроса для соответствия 20 пользователям, а затем с этими пользователями собирать последние 5 комментариев каждого из них.

Что-то, как это должно работать, или по крайней мере заставить вас потерять

MATCH (a : User) 
// only interested in users that have commented 
WHERE (a)-[:Commented]->() 
WITH a LIMIT 20 
// for those 20 users, get all their comments 
MATCH (a)-[c : Commented]->(b) 
// order results by time so we collect comments in order later 
WITH a, c, b 
ORDER BY c.time DESC 
// return results, getting only the slice of 5 collected comments for each user 
RETURN a.username AS username, COLLECT({commentBody : c.comments, commentedOn : c.time, postId : b.postId})[0..5] AS commentData