#neo4j
#neo4j
Вопрос:
Я использую сервер Neo4j, и мне нужно разрешить этот вариант использования:
У меня есть связанный список комментариев, и я хочу получить самые последние комментарии с указанием их автора и имени автора, которому они нравятся, поэтому мой связанный список выглядит следующим образом:
(Resource)-[:COMMENTS]->(Comment)-[:NEXT]->(Comment)-...-[:NEXT]->(Comment)
(User)-[:LIKES]->(Comment)
(User)-[:MAKES]->(Comment)
Я хочу, чтобы Neo4j извлекался для каждого комментария:
{text: comment_text,
date: comment_date,
author: comment_author,
likes: [users_who_like_the_comment] }
Я сделал этот запрос:
MATCH (r)-[:COMMENTS|NEXT*0..3]->(cc:Comment)<-[:LIKES]-(a:User)
WHERE id(r)=6468
WITH r,a, collect(cc) AS Likes
MATCH r-[:COMMENTS|NEXT*0..3]->(c:Comment), (u:User)-[:MAKES]->c
WITH Likes,c,u,a
RETURN {text: c.text, date: c.date, author: u.name, likes: CASE WHEN (c) in Likes THEN collect(a.name) END } as Comments
Проблема в том, что я получаю правильный результат, но без порядка, который должен быть предоставлен по умолчанию в связанном списке, поэтому я предполагаю, что я делаю что-то не так, но я не могу понять, что…
Ответ №1:
Как насчет этого:
MATCH (r)-[:COMMENTS]->()-[NEXT*0..3]->(c:Comment)<-[:MAKES]-(u:User)
WHERE id(r)=6468
OPTIONAL MATCH (c)<-[:LIKES]-(a:User)
RETURN {text: c.text, date: c.date, author: u.name, likes: collect(a.name)} as Comments
если это не сохраняет порядок, вы можете изменить его на:
MATCH path=(r)-[:COMMENTS]->()-[*NEXT*0..3]->(c:Comment)<-[:MAKES]-(u:User)
WHERE id(r)=6468
OPTIONAL MATCH (c)<-[:LIKES]-(a:User)
WITH {text: c.text, date: c.date, author: u.name, likes: collect(a.name)} as Comments,
length(path) as len
ORDER BY len ASC
RETURN Comments
И для хорошей оценки здесь все как GraphGist
Комментарии:
1. @carlosytal Если предоставленный ответ вам подходит, не забудьте принять его!