2015-08-13 2 views
3

Использование Neo4j с Cypherвысчитывать предел в Neo4j включая повторяющиеся строки

Я пытаюсь aquire что является по существу пользователей «стена». В этой стене есть сообщения от вас, ваших друзей и комментарии к сообщениям.

Это мой запрос до сих пор:

match (a:Account)-[:FRIEND*0..1]->(friend:Account)-[:POST]->(post:Post) 
where a.uid = "u132984734sas" 
optional match (post)<-[:COMMENT*0..1]-(comment:Comment)<-[:AUTHOR]-(commentAuthor:Account) 
return friend,post,comment,commentAuthor 
ORDER BY post.date_created DESC 
LIMIT 10 

Обратите внимание на LIMIT 10

Ну, я почти ожидал, что это, но так же, как доктриной в PHP при извлечении вложенных массивов вещей, здесь ряд возвращается с участием сообщение верхнего уровня и один комментарий для каждого комментария в сообщении.

Что это означает, если есть 20 сообщений, которые соответствуют этим критериям, не извлекая комментарии, было бы вернуться назад 10 фактическими сообщения благодарности LIMIT критерияма
позволяет сказать, что один пост в течение первых 10 результатов имеют 2 комментариев в он, теперь в результирующем наборе будет отображаться только 9 сообщений вместо 10. Поскольку первый комментарий всегда возвращается в первой строке, если он доступен, он не уменьшает число, возвращаемое результирующим набором, но каждый дополнительный комментарий за сообщение , делает.

Я бы хотел получить 10 достоверных результатов здесь, но я не уверен, что делать здесь.

Для краткости я использую Everyman\Neo4JPHP

Я даже предполагается, запрашивая 50 сообщений и обрезку только через собирание 10 лучших результатов, но это, очевидно, не кажется правильным хаха

+0

Вы хотите, чтобы 10 сообщений каждый раз? Просто используйте 'collect (comment), collect (commentAuthor)' в предложении return, и он соберет все комментарии в массив/коллекцию. Тогда каждая возвращенная строка будет 1 сообщение, и у вас всегда будет 10 сообщений, независимо от того, сколько комментариев от них будет отвиснуть. – FrobberOfBits

+0

@FrobberOfBits OH YA! Я смутно помню, как читал о сборе функции в документации, но полностью забыл об этом. Я не могу дождаться, когда попробую это, когда вернусь на свою рабочую станцию. Спасибо! – RedactedProfile

ответ

1

Вот небольшое изменение того, что @FrobberOfBits предложил в своем комментарии к вопросу.

При использовании aggregation, вместо создания двух коллекций (один для comment и другой для commentAuthor), вы можете создать единую коллекцию, элементами которого являются comment и commentAuthor пар.

MATCH (a:Account)-[:FRIEND*0..1]->(friend:Account)-[:POST]->(post:Post) 
WHERE a.uid = "u132984734sas" 
OPTIONAL MATCH (post)<-[:COMMENT*0..1]-(comment:Comment)<-[:AUTHOR]-(commentAuthor:Account) 
RETURN friend,post, COLLECT({comment: comment, commentAuthor: commentAuthor}) AS comments 
ORDER BY post.date_created DESC 
LIMIT 10 

 Смежные вопросы

  • Нет связанных вопросов^_^