我正在使用 neo4j 使用此查询来检索新闻提要。
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)) 作为分数
这里我添加了0.1以防止无穷大错误,因为current_time可能几乎等于postcreated_time(as prefer post class
)
这里对于单日来说很好,但是一天之后,时间部分并不能很好地贡献总分,因为我计算时间衰减因子的方式不一致,我需要一个能够始终发挥其作用的方程(我意味着在前 7 天以较低的速率降低分数,然后开始以较高的速率降低其对分数的贡献。一种方法是使用三角函数的 tan 或 cot 函数,但问题是,经过一段时间后,它们会改变符号。我将感谢每个人给我进一步的建议。
最佳答案
在基本层面上,这里通常使用指数时间衰减函数。像这样的东西:
score = score / elapsedTime^2
随着帖子发布后耗时增加,分数的值呈指数下降。 Reddit 和 Hacker News 等网站使用了很多 more complicated algorithms ,但这就是基本思想。
关于php - 使用 Neo4j 的新闻源中帖子/更新的时间衰减因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33176450/