2016-08-16 58 views
1

我目前工作的一個電影推薦查詢應該返回最「推薦的影響」電影使用下面的暗號查詢:Neo4j的暗號與電影推薦查詢的查詢性能問題

match (m:Movie) 
with m, size((m)<-[:LIKED]-(:User)-[:LIKED]->(:Movie)) as score 
order by score desc 
limit 10 
return m.title, score 

看完後graphdb(neo4j)電子書我的假設是,這應該是一個簡單的查詢neo4j但執行時間花了32737毫秒,這不是我所期待的。有沒有人有這些疑問的經驗,並有任何改善表現的建議?或者應該這個查詢執行得很好,我需要做一些neo4j/java配置調優?

查詢的輪廓:

enter image description here

結果:

enter image description here

回答

1

也許這是你可以預先計算。

你的分數是關係到每一個用戶喜歡的電影的數量。爲什麼不計算和存儲每個用戶所喜歡的電影數量(假設用戶只能一次觀看電影,而不是多次)?

請注意,此纔有意義,如果你只關心每一個用戶喜歡的電影的數量,並且都還好用添加這些了,即使它們代表在許多用戶同一部電影的多種喜好。

MATCH (u:User) 
SET u.likedCount = SIZE((u)-[:LIKED]->(:Movie)) 

每當用戶喜歡(或不喜歡)其他電影時,您都需要更新。

當此預填充的所有用戶,你所取得的查詢現在變成:

MATCH (m:Movie) 
WITH m 
MATCH (m)<-[:LIKED]-(u:User) 
WITH m, SUM(u.likedCount) as score 
ORDER BY score desc 
LIMIT 10 
RETURN m.title, score 

編輯

這當然也包括從電影中問題的每一個用戶喜歡。如果你真的需要考慮到這一點,你需要調整你一起:

WITH m, SUM(u.likedCount) - count(u) as score 

如果您只想計算用戶喜歡不同的電影在你的得分,那麼你就不能預先計算和必須使用類似stdob的東西 - 的答案。

+0

在這種特定的情況下,預計算似乎是實時報表至少需要30秒才能走的路。我認爲圍繞neo4j圖形數據庫的市場營銷有點誤導,因爲(在閱讀圖形數據庫書籍之後),我預計neo4j可以輕鬆處理這些實時查詢。謝謝您的幫助! –

+0

我認爲,當查詢所考慮的子圖進入數千萬事物的速度減慢時。在你的數據庫中的每部電影(其中大約有10k)做這種查詢與獲得單個電影的得分,甚至是少數幾部分之間也有區別,這可能會考慮數千個節點的子圖比數百萬。 – InverseFalcon

1

嘗試此查詢:

MATCH (M:Movie)<-[:LIKED]-(:User)-[:LIKED]->(R:Movie) 
WITH M, 
    size(collect(distinct R)) as score 
RETURN M.title as title, 
     score 
ORDER BY score DESC LIMIT 10 

作爲一個選項:

MATCH (M:Movie)<-[:LIKED]-(:User)-[:LIKED]->(R:Movie) 
RETURN M.title as title, 
     count(R) as score 
ORDER BY score DESC LIMIT 10 
+0

這搬回分貝的點擊量從44038477到266085,但翻了一番,從30920到62125 –

+0

執行時間@JeroenSlor嘗試更新的版本。 –

+0

第二個陳述(選項)花了54320,比我的問題中的原始陳述慢了20秒。還有其他建議嗎? –