Ich versuche ein Basis-Empfehlungssystem auf Neo4j zu implementieren. Grundsätzlich habe ich Nutzer und Künstler von Nutzern gemocht. Ich möchte fragen "Benutzer, die Damien Reis mochten, mochte auch diese Künstler". Das ist einfach, mit folgenden:Gelegentlich häufige Empfehlung zu Neo4j mit 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
Obwohl dieser Ansatz Art wahr, es gibt Coldplay, The Beatles (Benutzer, die für jedermann beliebt sind) wie folgt:
n.artist_name COUNT
coldplay 6193
radiohead 5377
the beatles 3998
death cab for cutie 3647
muse 3252
the killers 3064
jack johnson 2966
Ich neige dazu, , um herauszufinden, ungewöhnlich häufig Vorschläge. Mein beabsichtigter Ansatz ist es, coldplay mit calculating (6193/totalNumberOfLikesForColdplay) eine Punktzahl zu geben. Zum Beispiel, wenn insgesamt 61930 Leute Coldplay mögen, dann hat es eine Punktzahl von 9163/91630 = 0.1 und ich möchte alle Künstler in Abhängigkeit von dieser Punktzahl sortieren.
Ich habe versucht, die folgenden:
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
Aber es tooks für immer. Welche Art von Abfrage sollte ich eingeben, um das Ergebnis möglichst effizient zu erhalten?
Edit: Ich habe gerade festgestellt, dass die Abfrage, die ich oben versuchte, nicht ist, dass ich will. Es berechnet numberOfPeopleBothLikedColdplay_DamienRice/numberOfPeopleLikedDamienRice numberOfPeopleBothLikedTheBeatles_DamienRice/numberOfPeopleLikedDamienRice und so weiter
aber ich numberOfPeopleBothLikedColdplay_DamienRice/numberOfPeopleLikedColdplay numberOfPeopleBothLikedTheBeatles_DamienRice/numberOfPeopleLikedTheBeatles ...
Vielleicht berechnen möchten i t kann aktualisiert werden als
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
Aber jetzt gibt es mir "(keine Zeilen)" als Ergebnis zurück.
Edit2: Wie es vorgeschlagen wird, ich Abfrage wie folgt aktualisiert:
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
Aber es läuft noch immer. Übrigens habe ich 292516 Künstler, 359347 Menschen, 17549962 LIKES Beziehungen zwischen Künstler und Menschen. Und Sie können a annehmen: Person kann nur ein mögen: Künstler einmal, und das nur: Personen können mögen: Künstler
Wenn Sie die Anzahl der Likes berechnen möchten, sollten Sie die "Personen" zählen, die den Künstler mochten, also "COUNT (p)/COUNT (p2)" verwenden. –