获取节点列表以及最新相关节点的有效方法?

问题描述 投票:0回答:1

我有以下关系:

(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]
并以某种方式仅使用最新消息?

neo4j cypher
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.