Я пытаюсь создать систему оценки пользователей с помощью Neo4j и надеялся, что вы сможете дать какой-нибудь совет. Первоначально я думал, что подойти к этому можно, связав пользователя с узлом StarRate. В этом узле у меня должны были быть свойства связанного идентификатора свойства, а также свойства для каждой из 5 звезд в рейтинговой системе. Для каждого рейтинга (1-5 звезд) я буду увеличивать свойство указанной звезды.
Мой вопрос, при таком подходе, как мне собирать общий звездный рейтинг? Не стесняйтесь отбрасывать некоторые идеи или места, где я мог бы настроить свою реализацию. Спасибо
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
Вместо создания узла оценки (и отношения) для каждого пользователя было бы намного проще, если бы у вас было свойство рейтинга в каждом узле пользователя.
Новые вопросы
neo4j
Neo4j - это графическая база данных с открытым исходным кодом (GDB), хорошо подходящая для связанных данных. Пожалуйста, указывайте свою точную версию Neo4j, задавая вопросы. Вы можете использовать его для механизмов рекомендаций, обнаружения мошенничества, поиска на основе графиков, сетевых операций / безопасности и многих других пользовательских случаев. Доступ к базе данных осуществляется через официальные драйверы в Java, JavaScript, Python и .NET или через драйверы сообщества в PHP, Ruby, R, Golang, Elixir, Swift и других.