Использование Neo4J с Cypher
Я пытаюсь найти то, что по сути является «стеной» пользователя. На этой стене есть сообщения от вас, ваших друзей и комментарии.
Это мой запрос до сих пор:
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
Ну, я наполовину ожидал этого, но очень похоже на Doctrine в PHP при извлечении вложенных массивов вещей, здесь возвращается строка с сообщением верхнего уровня и отдельным комментарием для каждого комментария в сообщении.
Это означает, что если есть 20 постов, которые соответствуют этому критерию БЕЗ получения комментариев, он вернет 10 реальных постов благодаря LIMIT
критерии
Допустим, одно сообщение в первых 10 результатах содержит 2 комментария, теперь в resultSet будет только 9 сообщений вместо 10. Поскольку первый комментарий всегда возвращается в первой строке, если он доступен, он не отвлекает форму. число, возвращаемое набором результатов, но каждый дополнительный комментарий к сообщению делает.
Я хотел бы получить достоверные 10 результатов здесь, но я не уверен, что делать здесь.
Для краткости я использую Обыватель \ Neo4JPHP
Я даже подумывал о том, чтобы запросить 50 постов и обрезать только выбор 10 лучших результатов, но это явно не так, ха-ха
Вот небольшое изменение того, что @FrobberOfBits предложил в своем комментарии к вопросу.
Когда используешь агрегирование, вместо создания двух коллекций (одна для 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
Других решений пока нет …