我有以下关系:
(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]
以某种方式仅使用最新消息?
以下查询更节省内存。它使用CALL 子查询一次查找一个线程的最新消息。这与您的查询不同,您的查询必须将每个线程的所有消息收集到内存中。
考虑避免排序并使用列表推导来优化内存使用
如果您想完全避免“收集”,则需要进行重复查询,而且我还没有足够的测试数据来确定这是否是更好的选择
如果条件允许,可以增加一个新的关系[NEW_MESSAGE],新建(t)-[:HAS_MESSAGE]->(m:Message)时,删除旧的(t)-[:NEW_MESSAGE]->(:Message),再新建(t)-[:NEW_MESSAGE]->(m),这样只需要查询(t)-[:NEW_MESSAGE]->(m:Message)