Tenho o seguinte relacionamento:
(Thread)-[:HAS_MESSAGE]->(Message)
Um tópico pode ter de dezenas a milhares de mensagens.
Aqui está minha consulta para encontrar uma lista de tópicos e também retornar a mensagem mais recente de cada um, se existir.
MATCH (t:Thread)
OPTIONAL MATCH (t)-[:HAS_MESSAGE]->(m:Message)
WITH t, m
ORDER BY m.createdAt DESC
WITH t, COLLECT(m)[0] AS latestMessage
RETURN t, latestMessage
Estou com dificuldade para entender se há uma maneira de reescrever isso para evitar COLLECT(m)[0]
e, de alguma forma, usar apenas a mensagem mais recente?
A consulta a seguir é mais eficiente em termos de memória. Ela usa uma subconsulta CALL para encontrar a mensagem mais recente para um thread por vez. Isso é diferente da sua consulta, que precisa reunir na memória todas as mensagens para cada thread.
Considere evitar a classificação e usar compreensões de lista para otimizar o uso da memória
Se você quiser evitar "coletar" completamente, precisará fazer uma consulta duplicada, e ainda não tenho dados de teste suficientes para determinar se esta é uma opção melhor
Se as condições permitirem, você pode adicionar um novo relacionamento [NEW_MESSAGE]. Ao criar uma nova (t)-[:HAS_MESSAGE]->(m:Message), exclua a antiga (t)-[:NEW_MESSAGE]->(: Message) e, em seguida, crie uma nova (t)-[:NEW_MESSAGE]->(m), para que você precise consultar apenas (t)-[:NEW_MESSAGE]->(m:Message)