想要为neo4j数据库

时间:2016-03-20 19:43:01

标签: timer neo4j bigdata nosql

更新

我正在寻找的是某种自动触发机制,可以按照我的意愿完成工作。

用例:

基于帖子分数的排名。一个帖子的总分是a)。这个帖子的分数加上b)。所有评论的得分总和。 a和b都具有初始得分10,并且自创建以来每24小时将减少一个点直到它变为0.当帖子的总得分变为0时,之后认为它是不活动的,从等级中移除但保留在数据库用于其他目的。即使用户将来对此发表评论,此非活动帖子也将不再有效。

我在neo4j数据库中为每条记录实现计时器时遇到了问题。

假设我们有100万条记录,它们是帖子的帖子或评论。它们在创建时都有10个点,并且自创建以来每24小时减少一个点,直到它变为0并被视为不活动(启动计时器)。

我天真的想法是我们创建得分属性并每24小时更新一次属性。但考虑到数据的大小(当用户创建帖子和评论时,这种情况正在增长),密集型数据库操作非常缓慢。

我们有什么方法可以用来实现计时器或其他可以满足需求的方法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

正如@Evgen建议的那样,一种方法是只存储创建时间并在查询时计算得分。

例如:

创建评论:

CREATE (c:Comment {creationTime: timestamp(), text: {some_text}})

timestamp() Cypher函数将使用自纪元格式以来的毫秒来评估当前服务器时间。

查询所有有效评论:

MATCH (c:Comment) WHERE c.creationTime < (timestamp() + 86400000)
RETURN c

查找24小时内创建的所有评论。请务必在creationTime属性上创建索引:

CREATE INDEX ON Comment(creationTime);

计算并返回所有有效评论的点数:

假设您要查找给定帖子的所有有效评论,并按评分排列评论。

MATCH (p:Post {name: "somepost"})<-[:IS_ABOUT]-(c:Comment) 
WHERE c.creationTime < (timestamp() + 86400000)
RETURN c, 10 - ((timestamp() - c.creationTime) / 3600000) AS points

答案 1 :(得分:0)

  

我天真的想法是我们创建得分和更新的属性   属性每24小时一次。但考虑到数据的大小(是   当用户创建帖子和评论时,密集型数据库   操作真的很慢。

我认为这里的解决方案是在您第一次明白它不再活跃之后更改评论和发布的标签。因此,您不必每次都浏览所有评论和帖子,而且您只有相关内容。实施可能会有所不同。您仍然可以运行

等查询
$sql = "SELECT t.nama, b.nama, k.nama, r.program, r.rka1, b.kode, r.tahun FROM rka1 r 
    LEFT JOIN tahun t ON r.tahun=t.tahun 
    LEFT JOIN komisi k ON r.komisi=k.komisi 
    LEFT JOIN bidang b ON r.bidang=b.bidang 
    WHERE r.komisi={$komisi}
    ORDER BY r.tahun, r.bidang, r.komisi, r.rka1";

或者你可以使用创作时间。

更新

如果您不想删除标签评论。每当您创建新帖子或评论时,您都可以设置它们标签:新建:评论,:新:发布。发布后,评论变为非活动状态您删除标签新。您仍将获得良好的表现:新:评论&lt;&lt; :评论因此,您只需通过相关数据查询即可获得收益。