2015-11-24 62 views
0

我在neo4j中查詢了一些聚合函數,大約需要10秒才能檢索信息。我想要做的是將查詢結果存儲到redis中,並且redis數據庫會不時更新neo4j的結果。使用Redis存儲來自neo4j的查詢結果

一個記錄會像:

{ entry: "123", model: "abc", reactants: [{specie: "[email protected]", color: "black"}], .... } 

我使用的是快遞的node.js,預先感謝您的關注

UPDATE:我的查詢是相當廣泛的,我不得不這樣做'UNWIND'部分能夠通過反應物進行搜索(我也想要產品,但我不知道如何去做)。我不知道是否有可能進行優化,以至少2秒,但這裏有雲:

MATCH (rx:ModelReaction), 
     (rx)-[l:left_component]->(lc:MetaboliteSpecie), 
     (rx)-[r:right_component]->(rc:MetaboliteSpecie) 
     OPTIONAL MATCH (rx)-[:has_gpr]-(gpr:Root) 
     OPTIONAL MATCH (rx)-[:has_crossreference_to]-(cr)-[:has_ec_number]-(ec) 
WITH rx,r,cr,ec,gpr, 
    COLLECT(DISTINCT {specie: l.cpdEntry, stoichiometry: l.stoichiometry}) as reacts 
UNWIND reacts as rcts 
WITH rx,r,cr,ec,gpr, rcts, reacts 
WHERE rcts.specie =~ {searchText} OR rx.entry =~ {searchText} OR 
     rx.name =~ {searchText} OR (ec.entry IS NOT NULL AND 
     ec.entry =~ {searchText}) OR rx.geneRule =~ {searchText} 
RETURN {entry: rx.entry, 
    reactants: reacts, 
    products:COLLECT(DISTINCT {specie: r.cpdEntry, 
           stoichiometry: r.stoichiometry}), 
    orientation: rx.orientation, name: rx.name, ecnumber: ec.entry, 
    gpr_rule: rx.geneRule, gpr_normalized: gpr.normalized_rule} 
    ORDER BY ' + reactionsTableMap[sortCol] + ' ' + order + ' SKIP {offset} LIMIT {number}' 
+0

也許我們也可以看看你的Neo4j查詢是否可以優化? –

+0

我更新了我的問題與查詢,謝謝你的回覆 – chris

回答

3

最簡單的是結果從Neo4j的存儲在Redis的JSON字符串,並設置到期時間那把鑰匙。現在,當您需要檢索數據時,檢查密鑰是否存在,然後redis作爲緩存,如果密鑰不存在,則詢問Neo4j,將結果存儲在redis中並將其返回給Node.js程序。

僞代碼,因爲我不知道有關的Neo4j和Redis的Node.js的細節:

var result = redis.get("Record:123") 
if (result == null) { 
    result = neo4j.query("..."); 
    redis.setex("Record:123", toJson(result), 10); // set with expiry time 
} 
return result; 

的Redis將處理到期,所以你不必。

如果你想將它們存儲所有,你可以將它們存儲在列表或ZSET(排序由記錄ID例如設置),並調用Redis的LRANGE/ZRANGE檢索列表的一部分/套

實例與列表:

var exist = redis.exist("Records"); // check if something stored in redis 
if (!exist) { 
    var queryResult = neo4j.query("...); // get a list of results from neo4j 
    queryResult.foreach(result => redis.lpush("Records", toJson(result))); // add the results in the redis list 
} 
return redis.lrange("Records", 0, 50); // get the 50 first items 

現在只是重複上使用的redis.lrange這兩個參數通過獲取十個項目,然後在未來十年。

您也可以撥打redis EXPIRE在redis列表中設置到期時間。

+0

謝謝你的回答,其實我只是想存儲所有記錄(大約100 000),並一次檢索10,並與搜索一些過濾。根據我的理解,你的答案就是(1,「{entry:.....}」),我將把所有這些存儲在redis中,並將GET請求重定向到redis以檢索數據。如果您現在可以回答我的搜索部分,那麼我如何在JSON字段中搜索redis?再次感謝您的回答 – chris

+0

@chris查看更新 – Alex

+0

何時到期,redis上的記錄將被刪除,然後'if'語句(如果(!存在))失敗並且更新redis是正確的?另外,我希望能夠通過一些參數進行搜索,並通過某些參數對記錄進行排序,例如,我在我的主要問題 – chris