我是公司提供約會服務的服務器工程師。 目前我正在爲我們的新推薦引擎建立一個PoC。 我嘗試使用neo4j。但是這個數據庫的性能不符合我們的需求。 我有強烈的感覺,我做錯了什麼,neo4j可以做得更好。 那麼有人可以給我一個建議,如何提高我的Cypher查詢的性能或如何以正確的方式調整neo4j? 我使用的是neo4j-enterprise-2.3.1,它在Amazon Linux上運行在c4.4xlarge實例上。 在我們的數據集中,每個用戶可以與其他用戶有4種類型的關係 - LIKE,DISLIKE,BLOCK和MATCH。 他也有像countryCode,生日和性別的屬性。neo4j的低性能
我使用neo4j-import工具將所有用戶和關係從RDBMS導入neo4j。 因此,每個用戶都是具有屬性的節點,每個引用都是一種關係。
從Neo4j的導入工具,該報告稱,:
節點,
性能和
關係
被導入。
所以這是巨大的DB :-)在我們的情況下,一些節點最多可以有30個000引出的關係..
我取得了Neo4j的3個指標:
Indexes
ON :User(userId) ONLINE
ON :User(countryCode) ONLINE
ON :User(birthday) ONLINE
然後我試着在網上建立利用推薦引擎的查詢:
MATCH (me:User {userId: {source_user_id} })-[:LIKE | :MATCH]->()<-[:LIKE | :MATCH]-(similar:User)
USING INDEX me:User(userId)
USING INDEX similar:User(birthday)
WHERE similar.birthday >= {target_age_gte} AND
similar.birthday <= {target_age_lte} AND
similar.countryCode = {target_country_code} AND
similar.gender = {source_gender}
WITH similar, count(*) as weight ORDER BY weight DESC
SKIP {skip_similar_person} LIMIT {limit_similar_person}
MATCH (similar)-[:LIKE | :MATCH]-(recommendation:User)
WITH recommendation, count(*) as sheWeight
WHERE recommendation.birthday >= {recommendation_age_gte} AND
recommendation.birthday <= {recommendation_age_lte} AND
recommendation.gender= {target_gender}
WITH recommendation, sheWeight ORDER BY sheWeight DESC
SKIP {skip_person} LIMIT {limit_person}
MATCH (me:User {userId: {source_user_id} })
WHERE NOT ((me)--(recommendation))
RETURN recommendation
這裏的執行計劃的用戶之一: plan
當我執行此查詢的用戶列表,我有結果:
count=2391, min=4565.128849, max=36257.170065, mean=13556.750555555178, stddev=2250.149335254768, median=13405.409811, p75=15361.353029999998, p95=17385.136478, p98=18040.900481, p99=18426.811424, p999=19506.149138, mean_rate=0.9957385490980866, m1=1.2148195797996817, m5=1.1418078036067119, m15=0.9928564378521962, rate_unit=events/second, duration_unit=milliseconds
所以即使是最快的是實時推薦過慢..
你能告訴我我是什麼做錯了?
謝謝。
你可以上傳計劃與盒子擴大呢? –
上傳擴展計劃 – Mike
嘿邁克,你可以給我發一封電子郵件,michael在neo4j.com,很想訪問你的數據庫來幫助你處理你的查詢。 –