使用Neo4j建立论坛模型

时间:2014-04-23 07:37:04

标签: neo4j

我需要使用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建模这种论坛的更好方法吗?

1 个答案:

答案 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