Ограничение одной записи Cypher COLLECTION

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

Мой Сайфер это:

MATCH (p:Person)-[:SENT]->(m:Message)-[:SENT_TO]->(op:Person{username:"the_username"})
WHERE NOT p.username = "the_username"WITH p,m
ORDER BY m.created_at DESC
RETURN DISTINCT p.first_name as first_name,
p.last_name as last_name,
p.username as username,
p.image_name as image_name,
COLLECT({subject:m.subject,
created_at:m.created_at,
body:m.body,
message_id:id(m),
status:m.status}) as message

Я ожидаю, что результат выдаст введенное верхнее сообщение (с помощью свойства созданного в узле Сообщение), а затем отсортирует результаты по свойству созданного сообщения, чтобы пользователь мог видеть человека, который отправил им сообщение последним.

Спасибо!

2

Решение

Чтобы получить только самое последнее сообщение от каждого человека, отправляющего сообщение человеку с желаемым именем пользователя, вы можете использовать этот слегка измененный запрос:

MATCH (p:Person)-[:SENT]->(m:Message)-[:SENT_TO]->(op:Person{username:"the_username"})
WHERE NOT p.username = "the_username"WITH p,m
ORDER BY m.created_at DESC
WITH p, (COLLECT(m))[0] AS m0
RETURN DISTINCT p.first_name as first_name,
p.last_name as last_name,
p.username as username,
p.image_name as image_name,
COLLECT({subject:m0.subject,
created_at:m0.created_at,
body:m0.body,
message_id:id(m0),
status:m0.status}) as message

Изменения:

  1. Этот пункт был добавлен: WITH p, (COLLECT(m))[0] AS m0, Это объединяет все сообщения для каждого отправителя (по убыванию created_at order) и сохраняет только первое сообщение, присваивая ему идентификатор «m0».
  2. Последующие пункты были изменениями, чтобы использовать «m0» вместо «m».

Примечание: в # 1 вы можете использовать AS m вместо этого, что позволит вам избежать необходимости делать № 2. Но я решил использовать другой идентификатор, чтобы облегчить понимание и поддержку запроса.

2

Другие решения

Других решений пока нет …