Я пытаюсь внедрить базовую систему рекомендаций на Neo4j. В принципе, пользователи и художники любят пользователей. Я хотел бы запросить «пользователей, которым нравился рисовый рис, также понравились эти художники». Это легко со следующими:Необычно распространенная рекомендация по Neo4j с Cypher
MATCH (n:Artist)<-[:LIKES]-(p:Person)-[:LIKES]->(n2:Artist {artist_name: "damien rice"})
RETURN n.artist_name, COUNT(n) AS COUNT
ORDER BY COUNT DESC
LIMIT 30
Хотя этот подход отчасти верно, то возвращается Coldplay, The Beatles (пользователи, которые пользуются популярностью для всех) следующим образом:
n.artist_name COUNT
coldplay 6193
radiohead 5377
the beatles 3998
death cab for cutie 3647
muse 3252
the killers 3064
jack johnson 2966
Я, как правило, чтобы выяснить необычно общий предложения. Мой намеченный подход состоит в том, чтобы дать оценку для coldplay с вычислением (6193/totalNumberOfLikesForColdplay). Например, если всего 61930 человек понравилось coldplay, то у него есть оценка 9163/91630 = 0,1, и я хочу отсортировать всех исполнителей в зависимости от этого балла.
Я попытался следующие:
MATCH (n:Artist)<-[:LIKES]-(p:Person)-[:LIKES]->(n2:Artist {artist_name: "damien rice"})
MATCH (n2:Artist {artist_name: "damien rice"})<-[:LIKES]-(p2:Person)
RETURN n.artist_name, COUNT(n)/COUNT(n2) AS SCORE
ORDER BY SCORE DESC
LIMIT 30
Но навсегда Наталья принимает. Какой запрос я должен ввести, чтобы получить результат наиболее эффективным способом?
Редактировать: Я только понял, что запрос, который я пробовал выше, не то, что я хочу. Он вычисляет numberOfPeopleBothLikedColdplay_DamienRice/numberOfPeopleLikedDamienRice numberOfPeopleBothLikedTheBeatles_DamienRice/numberOfPeopleLikedDamienRice и так далее
Однако я хочу, чтобы вычислить numberOfPeopleBothLikedColdplay_DamienRice/numberOfPeopleLikedColdplay numberOfPeopleBothLikedTheBeatles_DamienRice/numberOfPeopleLikedTheBeatles ...
Так может быть, я t может быть обновлен как
MATCH (n:Artist)<-[:LIKES]-(p:Person)-[:LIKES]->(n2:Artist {artist_name: "damien rice"})
MATCH (n2:Artist {artist_name: n.name})<-[:LIKES]-(p2:Person)
RETURN n.artist_name, COUNT(p)/COUNT(p2) AS SCORE
ORDER BY SCORE DESC
LIMIT 30
Но теперь он возвращает меня «(нет строк)».
Edit2: Как предполагается, я обновил запрос следующим образом:
MATCH (p2:Person)-[:LIKES]->(n:Artist)<-[:LIKES]-(p:Person)-[:LIKES]->
(n2:Artist {artist_name: "damien rice"})
RETURN n.artist_name, COUNT(p)/COUNT(p2) AS SCORE
ORDER BY SCORE DESC
LIMIT 30
Но он по-прежнему работает вечно. Кстати, у меня 292516 художников, 359347 человек, 17549962 ЛЮБЛЮ отношения между художником и людьми. И вы можете предположить: Лицо может понравиться только одному художнику: только один: Лицам может понравиться: Художники
Если вы хотите рассчитать количество понравившихся вам, вы должны посчитать «лиц», которые понравились художнику, т. Е. Использовать «COUNT (p)/COUNT (p2)». –