我正試圖在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
雖然這種方法是一種真實的,它返回酷玩樂隊,披頭士如下(這是流行的所有人用戶):
n.artist_name COUNT
coldplay 6193
radiohead 5377
the beatles 3998
death cab for cutie 3647
muse 3252
the killers 3064
jack johnson 2966
我傾向於搞清楚不常見的建議。我想要的方法是通過計算(6193/totalNumberOfLikesForColdplay)給coldplay一個分數。例如,如果總共有61930人喜歡酷玩,那麼它的得分爲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
但它永遠tooks。我應該輸入什麼樣的查詢以最有效的方式獲得結果?
編輯:我剛剛意識到,我上面試過的查詢不是我想要的。它計算 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)」。 –