我需要使用Neo4j为论坛建模。我有“论坛”节点有消息,可选这些消息有回复:论坛 - >消息 - >回复
我用来检索论坛消息的密码查询及其回复是:
start forum=node({forumId}) match forum-[*1..]->msg
where (msg.parent=0 and msg.ts<={ts} or msg.parent<>0)
return msg ORDER BY msg.ts DESC limit 10
此查询检索具有时间&lt; = ts及其所有回复的消息(消息具有parent = 0且回复具有父&lt;&gt; 0)
我的问题是我需要检索10条消息(限制10)的页面,而不管数量或回复。
例如,如果我有20封邮件,第一封邮件有100封,则只会返回10行:第一封邮件和9封回复,但我需要前10封邮件和第1封邮件的100条回复。
如何根据邮件数量而不是回复来限制结果?
ts属性已编入索引,但在将其与其他where子句混合时,此查询是否有效?
你知道用Neo建模这种论坛的更好方法吗?
答案 0 :(得分:1)
假设您切换到标签并避免使用ID(因为它们可以回收,因此不是稳定的标识符):
MATCH (forum:FORUM)<--(message:MESSAGE {parent:0})
WHERE forum.name = '%s' // where %s identifies the forum in a *stable* way
WITH message // using a subquery allows to apply LIMIT only to main messages
ORDER BY message.ts DESC
LIMIT 10
OPTIONAL MATCH (message)<-[:REPLIES_TO]-(replies)
RETURN message, replies
此处唯一重要的更改是在两个子查询中拆分回复和消息匹配,以便LIMIT子句仅适用于第一个子查询。
但是,您需要将相关回复链接到第二个子查询中匹配的主要消息(我引入了一个虚构的关系REPLIES_TO来链接对消息的回复)。
当你需要获取2,3,4页等 你需要一个额外的参数(上一页的最大消息时间戳,比如previous_timestamp)。
第一个子查询WHERE子句变为:
WHERE forum.name = '%s' AND message.ts > previous_timestamp