我有以下关系:
(Thread)-[:HAS_MESSAGE]->(Message)
一个线程可以包含数十到数千条消息。
这是我的查询,用于查找线程列表,并且还返回每个线程的最新消息(如果存在)。
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
我很难理解是否有办法重写它以避免
COLLECT(m)[0]
并以某种方式仅使用最新消息?
考虑避免排序并使用列表理解来优化内存使用
MATCH (t:Thread)
OPTIONAL MATCH (t)-[:HAS_MESSAGE]->(m:Message)
WITH t, collect(m) as ms, MAX(m.createAt) as lt
RETURN t, [m in ms where m.createAt = lt][0] as latestMessage
如果您想完全避免“收集”,则需要进行重复查询,并且我还没有足够的测试数据来确定这是否是更好的选择
MATCH (t:Thread)
OPTIONAL MATCH (t)-[:HAS_MESSAGE]->(m:Message)
WITH t, MAX(m.createAt) AS lt
MATCH (t)-[:HAS_MESSAGE]->(latestMessage:Message {createAt: latestTimestamp})
RETURN t, latestMessage