2014-07-07 152 views
1

我有一個嵌入式neo4j服務器與紅寶石在軌道上。加速neo4j密碼查詢

這些配置:

neostore.nodestore.db.mapped_memory=25M 
neostore.relationshipstore.db.mapped_memory=240M 
neostore.propertystore.db.mapped_memory=230M 
neostore.propertystore.db.strings.mapped_memory=1200M 
neostore.propertystore.db.arrays.mapped_memory=130M 

wrapper.java.initmemory=1024 
wrapper.java.maxmemory=2048 

大約有15lakh電影節點。以下查詢需要執行大約5secs

MATCH (movie:Movie) 
WITH movie, toInt(movie.reviews_count) + toInt(movie.ratings_count) AS weight 
RETURN movie, weight as weight 
ORDER BY weight DESC 
SKIP skip_count 
LIMIT 10 

這裏的skip_count隨用戶滾動查看結果而變化。

這另一個查詢其目的是從一個特定的導演獲得電影大約需要9secs

MATCH (movie:Movie) , (director:Director)-[:Directed]->(movie) 
WHERE director.name =~ '(?i)DIRECTOR_NAME' 
WITH movie, toInt(movie.ratings_count) * toInt(movie.reviews_count) * toInt(movie.rating) AS total_weight 
RETURN movie, total_weight 
ORDER BY total_weight DESC, movie.rating DESC 
LIMIT 10 

如何減少查詢執行時間?

回答

2

關於第一個查詢:

您可能使重排序在圖中通過使用重量遞減順序:NEXT_WEIGHT關係連接所有影片節點明確,所以電影建立一個鏈表。

您的查詢看起來像:

MATCH p=(:Movie {name:'<name of movie with highest weight>'})-[:NEXT_WEIGHT*..1000]-() 
WHERE length(p)>skip_count AND length(p)<skip_count+limit 
WITH p 
ORDER BY length(p) 
WITH last(nodes(p)) as movie 
RETURN movie, toInt(movie.reviews_count) + toInt(movie.ratings_count) AS weight 

關於第二個查詢:

您應該使用索引來加速導演查找。不幸的是,索引查找目前僅支持精確查找。因此,要麼確保搜索字符串是正確的大/小寫的方式,或者其他屬性存儲歸一化形式:

MATCH (d:Director) set d.lowerName = LOWER(d.name) 

確保有標籤Director和財產LowerName在指數:

CREATE INDEX ON :Director(lowerName) 

而你的查詢應該看起來像:

MATCH (director:Director)-[:Directed]->(movie) 
WHERE director.name = {directorName} 
RETURN movie, toInt(movie.ratings_count) * toInt(movie.reviews_count) *   toInt(movie.rating) AS total_weight 
ORDER BY total_weight DESC, movie.rating DESC 
LIMIT 10 
+0

嗨Stefan!謝謝回覆。我認爲可以通過這種方式來構建第一個查詢,以提高效率。 MATCH p =(:電影{name:'<顯示的最後一部電影的名字>')) - [:NEXT_WEIGHT * limit] - ()RETURN節點(p)(因爲我可以跟蹤用戶顯示的最後一部電影會話)。 對於第二個查詢:是否有一種方法可以使用'NEXT_WEIGHT'來避免使用'order by'? –

+1

我想單個導演只有100部電影,他擔任導演。如果確保通過索引查找找到director節點,它應該足夠快。 –

+0

是的,它似乎適用於這種情況。但有什麼辦法可以用'NEXT_WEIGHT'關係來執行。這樣它也可以用於其他類似的情況。 –