2017-04-24 74 views
0

我试图创建通过使用的Neo4j的用户评级系统,并希望你们能借一些建议。 我最初想到的方式是通过将用户与StarRate节点相关联。在这个节点中,我将拥有相关属性ID的属性,以及评分系统中每个5星的属性。对于他们给予的每一个评分(1-5星),我都会增加这位明星的财产。Neo4j的5星级用户评价实施

我的问题是,用这种方法,我应该如何去收集全面的星级?随意放弃一些想法或地点,我可以调整我的实施。 谢谢

回答

0

在这一天结束,这取决于其额外使用,你将需要。反正你将需要获得的票数和totalStars所有恒星的总和量的可变votesAmount,因此而易于更新它,你可以得到总的评价。 I'll下降一些额外的例子:

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}) 

这可以很容易地直接从它的节点获得的平均等级的用户,而it's也容易增加新的评级(加上星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 
+0

谢谢完成!我将使用更简单的两个属性版本 –

1

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