我试图通过使用Neo4j创建一个用户评级系统,并希望你们都可以提供一些建议。 我最初想到的方法是通过将用户与StarRate节点相关联。在这个节点中,我将获得相关属性id的属性,以及评级系统中每个5星的属性。对于他们给出的每个评级(1-5星),我将增加该星的属性。
我的问题是,通过这种方法,我该如何收集整体星级?请随意删除一些我可以调整实现的想法或地点。 感谢
答案 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