Neo4J — связанный список: возвращает результаты без порядка

#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 Если предоставленный ответ вам подходит, не забудьте принять его!