我正在使用neo4j使用此查询检索新闻Feed。
MATCH (u:Users {user_id:140}),(p:Posts)-[:CREATED_BY]->(pu:Users)
WHERE (p)-[:CREATED_BY]->(u) OR (p:PUBLIC AND (u)-[:FOLLOW]->(pu)) OR
(p:PRIVATE AND (p)-[:SHARED_WITH]->(u))
OPTIONAL MATCH (p)-[:POST_MEDIA]->(f)
OPTIONAL MATCH (p)-[:COMMENT]->(c)<-[:COMMENT]-(u3) RETURN
(p.meta_score+0.2*p.likes+0.1*p.dislikes + 10/(((".time()."-
p.created_time)/3600)+0.1)) as score,
{user_id:pu.user_id,firstname:pu.firstname,lastname:pu.lastname,
profile_photo:pu.profile_photo,username:pu.username} as pu, p,
collect({user_id:u3.user_id,profile_photo:u3.profile_photo,text:c.text}) as comment,
collect(f) as file ORDER BY score DESC,
p.post_id DESC LIMIT 25
在这个获得分数的等式中我主要使用这个等式p.meta_score+0.1*p.likes-0.05*p.dislikes + 10/(((current_time-
p.created_time)/3600)+0.1)) as score
这里我添加了0.1以防止无穷大错误,因为current_time可能几乎等于post created_time(as p refer post class
)
这对于单日来说很好,但是在一天之后time
部分没有提供良好的总分,因为我计算时间衰减因子的方式不一致我需要一个一致地发挥其作用的方程式(我的意思是前7天以较低的比率降低得分,而不是以较高的比率开始降低对得分的贡献。一种方法是使用trigonometry's tan or cot
函数,但问题是,经过一段时间后,它们会改变那里的迹象。我要感谢所有人给我进一步的建议。
答案 0 :(得分:3)
在基本级别,通常在这里使用指数时间衰减函数。类似的东西:
score = score / elapsedTime^2
随着帖子增加后经过的时间,分数值呈指数下降。像Reddit和Hacker News这样的网站使用了很多more complicated algorithms,但这是基本的想法。