Node.js 使用Redis存储来自neo4j的查询结果

Node.js 使用Redis存储来自neo4j的查询结果,node.js,express,neo4j,redis,Node.js,Express,Neo4j,Redis,我在neo4j中有一个查询,其中包含一些聚合函数,检索信息大约需要10秒钟。我想做的是将查询结果存储到redis中,redis数据库会不时更新neo4j的结果 一个记录将类似于: { entry: "123", model: "abc", reactants: [{specie: "abc@12", color: "black"}], .... } 我将node.js与express一起使用,提前感谢您的关注 更新:我的查询非常广泛,我必须做“放松”部分,以便能够通过反应物进行搜索(我也想得到

我在neo4j中有一个查询,其中包含一些聚合函数,检索信息大约需要10秒钟。我想做的是将查询结果存储到redis中,redis数据库会不时更新neo4j的结果

一个记录将类似于:

{ entry: "123", model: "abc", reactants: [{specie: "abc@12", color: "black"}], .... }
我将node.js与express一起使用,提前感谢您的关注

更新:我的查询非常广泛,我必须做“放松”部分,以便能够通过反应物进行搜索(我也想得到产品,但我不知道怎么做)。我不知道是否可以优化到至少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}'

最简单的方法是将Neo4j的结果作为JSON字符串存储在redis中,并设置该键的到期时间。现在,当您需要检索数据时,您需要检查密钥是否存在,然后redis将用作缓存,如果密钥不存在,您可以询问Neo4j,将结果存储在redis中,并将其返回给Node.js程序

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

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列表上设置过期时间。

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

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

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列表中设置过期时间。

谢谢您的回答,实际上我只想存储所有记录(大约100000条),一次检索10条,并通过搜索进行一些过滤。根据我从您的回答中了解到的情况,使用类似于(1,{entry:…})的东西,我将所有这些存储在redis中,并将GET请求重定向到redis以检索数据。如果您现在可以回答我搜索部分,我如何通过JSON字段在redis中搜索?再次感谢您的回答何时到期redis上的记录将被删除,然后“if”语句(if(!exist))将失败并更新redis,对吗?此外,如果可能的话,我希望能够通过一些参数进行搜索,并通过一些参数对记录进行排序,比如我在主要问题中提出的neo4j查询redis
EXPIRE
命令在任何键上设置一个过期时间,之后该键将被redis简单地删除,因此
EXIST
命令返回
false
。如果您想使用一些参数对结果进行排序,只需使用Neo4J即可,只需将redis用作请求的缓存,这样会更容易。感谢您的回答,实际上我只想存储所有记录(约10万条),一次检索10条,并通过搜索进行一些过滤。根据我从您的回答中了解到的情况,使用类似于(1,{entry:…})的东西,我将所有这些存储在redis中,并将GET请求重定向到redis以检索数据。如果您现在可以回答我搜索部分,我如何通过JSON字段在redis中搜索?再次感谢您的回答何时到期redis上的记录将被删除,然后“if”语句(if(!exist))将失败并更新redis,对吗?此外,如果可能的话,我希望能够通过一些参数进行搜索,并通过一些参数对记录进行排序,比如我在主要问题中提出的neo4j查询redis
EXPIRE
命令在任何键上设置一个过期时间,之后该键将被redis简单地删除,因此
EXIST
命令返回
false
。如果您想使用某些参数对结果进行排序,只需使用Neo4J即可,只需将redis用作请求的缓存,这样会更容易。也许我们还可以查看一下您的Neo4J查询,看看是否可以对其进行优化?我用查询更新了我的问题,谢谢replying@chris(如果仍然相关)您可能需要考虑使用ReDigice。它可以通过Redis PerformanceApps为您提供图形数据库功能我们还可以查看您的Neo4j查询,看看它是否可以优化?我用查询更新了我的问题,谢谢replying@chris(如果它仍然是相关的)你可能想考虑使用ReDigGrand。它可以为您提供具有Redis性能的Graph DB功能