首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Redis存储来自neo4j查询的结果

使用Redis存储来自neo4j查询的结果
EN

Stack Overflow用户
提问于 2015-11-24 15:26:00
回答 1查看 765关注 0票数 0

我在neo4j中有一个带有一些聚合函数的查询,检索信息大约需要10秒。我想要做的是将查询结果存储到redis中,并不时地由redis数据库更新来自neo4j的结果。

其中一项记录如下:

代码语言:javascript
代码运行次数:0
运行
复制
{ entry: "123", model: "abc", reactants: [{specie: "abc@12", color: "black"}], .... }

我正在使用node.js和快递,谢谢您的关注

更新:我的查询是相当广泛的,我必须做‘展开’部分,才能通过反应物搜索(我也想要产品,但我不知道怎么做)。我不知道是否有可能被优化到至少2秒,但如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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}'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 15:37:53

最简单的方法是将来自Neo4j的结果作为一个JSON字符串存储在redis中,并在该键上设置一个过期时间。现在,当您需要检索数据时,检查键是否在那里,然后redis充当缓存,如果键不存在,请询问Neo4j,将结果存储在redis中,并将其返回给您的Node.js程序。

伪代码,因为我不知道Node.js关于Neo4J和Redis的细节:

代码语言:javascript
代码运行次数:0
运行
复制
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;

红葡萄酒会处理到期,这样你就不用了。

如果要全部存储,可以将它们存储在列表或ZSET中(例如,按记录Id排序),只需调用redis LRANGE/ZRANGE来检索列表/集的一部分。

列表示例:

代码语言:javascript
代码运行次数:0
运行
复制
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列表上设置过期时间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33897513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档