Neo4j 5星级用户评分实现

时间:2017-04-24 21:35:13

标签: neo4j

我试图通过使用Neo4j创建一个用户评级系统,并希望你们都可以提供一些建议。 我最初想到的方法是通过将用户与StarRate节点相关联。在这个节点中,我将获得相关属性id的属性,以及评级系统中每个5星的属性。对于他们给出的每个评级(1-5星),我将增加该星的属性。

我的问题是,通过这种方法,我该如何收集整体星级?请随意删除一些我可以调整实现的想法或地点。 感谢

2 个答案:

答案 0 :(得分:1)

如果您在每个用户节点中只有一个评级属性,那么不是为每个用户创建评级节点(和关系),而是更简单。

答案 1 :(得分:0)

在一天结束时,这取决于您将需要哪些额外用途。无论如何,你需要一个变量votesAmount来获得所获得的投票数量和totalStars所有明星的总和,这样你就可以获得总评级,同时易于更新。我会放一些额外的例子:

1)如果您想知道,或者认为您将来想知道谁评了谁,那么我建议为每个评分创建:

(user:User)-[rates{rating:3}:RATES]->(otherUser:User)

这些额外信息可用于跟踪活跃用户,有毒用户等。这里的数学将是:

MATCH (user:User{name:'user1'})
OPTIONAL MATCH (user)<-[rates:RATES]-(:User)
WITH count(rates) AS totalVotes, sum(rates.rating) AS totalStars

2)如果只想知道用户的平均评分,那么我会:

(user:User)-[:HAS_RATING]->(rating{totalStars=16, votesAmount=4})

这样可以直接从其节点轻松获得用户的平均评分,同时也可以轻松添加新评级(将星标添加到totalStars,将1添加到votesAmount)。它与您的想法相同,但如果您不想使用它,请使用较少的信息(没有星星分解)。

使用您的原始实现,用户的总评分为:

MATCH (user:User{name:'user1'})-[:HAS_RATING]->(rating:Rating)
WITH rating.stars1 + rating.stars2 + rating.stars3 + rating.stars4 + rating.stars5 as votesAmount,
rating.stars1 * 1 + rating.stars2 * 2 + rating.stars3 * 3 + rating.stars4 * 4 + rating.stars5 * 5 as totalStars

在任何实施中,我都会以

结束
RETURN totalStars/votesAmount AS totalRating