Я пытаюсь создать систему оценки пользователей с помощью Neo4j и надеялся, что вы сможете дать какой-нибудь совет. Первоначально я думал, что подойти к этому можно, связав пользователя с узлом StarRate. В этом узле у меня должны были быть свойства связанного идентификатора свойства, а также свойства для каждой из 5 звезд в рейтинговой системе. Для каждого рейтинга (1-5 звезд) я буду увеличивать свойство указанной звезды.

Мой вопрос, при таком подходе, как мне собирать общий звездный рейтинг? Не стесняйтесь отбрасывать некоторые идеи или места, где я мог бы настроить свою реализацию. Спасибо

0
james.dole 25 Апр 2017 в 00:35

2 ответа

Лучший ответ

В конце концов, это зависит от того, какое дополнительное использование вам понадобится. В любом случае вам понадобится переменная voiceAmount для количества полученных голосов, а 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 к голосовому количеству). Это то же самое, что и ваша идея, но с меньшим количеством информации (без разбивки звезд), если вы не хотите ее использовать.

При вашей первоначальной реализации общий рейтинг для пользователя будет таким:

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
yawmoght 24 Апр 2017 в 22:13

Вместо создания узла оценки (и отношения) для каждого пользователя было бы намного проще, если бы у вас было свойство рейтинга в каждом узле пользователя.

1
cybersam 24 Апр 2017 в 21:45