2013-08-30 201 views
1

我正在嘗試構建Facebook上人們喜歡的不同實體的圖形,以創建基本的跨域推薦引擎。neo4j(cypher)很慢

我有不同的實體(電影,書籍,音樂等)的數據。爲每個項目創建節點,其屬性爲項目名稱(電影名稱,圖書等)和項目實體類型(電影,書籍等)。任何兩個節點之間都有它們之間的關係,稱爲「關聯」這種關係也有一個「強度」屬性,這等於沒有。的人喜歡這兩個項目。

我使用FB用戶來連接這些節點。 FB用戶也是圖中的節點,其屬性是人的姓名和類型。這些節點和項目節點之間的關係稱爲「喜歡」。現在,如果一個人喜歡看電影,我想通過遍歷圖來推薦他的書籍或音樂。這是我想遍歷圖形的暗號查詢:

START root = node(<LIKED_MOVIE_NODE_ID>) 
MATCH p = root-[rel1:affinity*..3]-(movies)<-[rel2:likes]-(persons)-[rel3:likes]->(books) 
WHERE HAS(movies.type) and movies.type = "movies" and HAS(persons.type) and persons.type = "person" and HAS(books.type) and books.type = "books" 
RETURN books 

這將運行速度很慢,有時需要高達500秒。我有13000部電影,2000本書和3000個音樂節點。連接他們是16000人。所有在一起有約30萬的關係。

我的問題是:

  1. 我做錯什麼了嗎?有一個更好的方法嗎? 我是neo4j的新手。我已經嘗試了一些調整neo4j graphDB的技巧。我已經將最小堆大小增加到了4 GB,並且正在使用32 GB RAM的8核心機器上運行它。

  2. 我想知道rel1和rel2和rel3的關係的強度。 Rel1擁有財產實力。我無法找到它,

請指教,因爲我正在放棄neo4j並回到SQL的邊緣。至少它工作。當比較遍歷和核心API :(

Regds, Paritosh

回答

0

Cypher支架是緩慢的。其實很慢(http://java.dzone.com/articles/get-full-neo4j-power-using

這就是說,你可以嘗試限制節點的Neo4j處理量,將你的Match分成不同的WITH子句,根據你的用例,你可以把 root- [rel1:affinity * .. 3] - (movies)放在一個單獨的子句中,並過濾掉不同的電影。 neo4j將處理導致電影的所有路徑組合。

PS:

WHERE HAS(movies.type) and movies.type = "movies" and HAS(persons.type) and persons.type = "person" and HAS(books.type) and books.type = "books" 

可以改寫爲

WHERE movies.type! = "movies" and persons.type! = "person" and books.type! = "books" 

或者,如果你正在使用的Neo4j 2.0.0M4你可以跳過HAS()