首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Neo4j建立论坛模型

用Neo4j建立论坛模型
EN

Stack Overflow用户
提问于 2014-04-23 07:37:03
回答 1查看 238关注 0票数 0

我需要模拟一个论坛与Neo4j。我有有消息的“论坛”节点,而且这些消息也有回复:论坛->消息->回复。

我用来检索论坛信息及其回复的密码查询是:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-23 07:55:43

假设您切换到标签并避免ID(因为它们可以回收,因此不是稳定的标识符):

代码语言:javascript
复制
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子句变成:

代码语言:javascript
复制
WHERE forum.name = '%s' AND message.ts > previous_timestamp
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23237853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档