我需要模拟一个论坛与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此查询使用time<=ts检索消息及其所有答复(消息具有parent=0,答复具有parent<>0)
我的问题是,我需要检索10条消息的页面(限制为10条),而不依赖于数量或回复。
例如,如果我有20条消息,第一条消息有100条回复,它将只返回10行:第一条消息和9条回复,但我需要前10条消息和第一条回复的100条回复。
如何根据消息的数量而不是它们的回复来限制结果?
ts属性是索引的,但是当将它与其他where子句混合时,这个查询是否有效?
你知道一个更好的方式来模拟这样的论坛与Neo?
发布于 2014-04-23 07:55:43
假设您切换到标签并避免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这里唯一重要的更改是将应答和消息匹配拆分到两个子查询中,这样限制子句只适用于第一个子查询。
但是,您需要将相关的回复链接到第二个子查询中匹配的主消息(我引入了一个虚构的关系REPLIES_TO来链接到消息的回复)。
当您需要获取页面2,3,4等时,您需要一个额外的参数(这是上一页的最大消息时间戳,比如previous_timestamp)。
第一个子查询WHERE子句变成:
WHERE forum.name = '%s' AND message.ts > previous_timestamphttps://stackoverflow.com/questions/23237853
复制相似问题