我在neo4j中有一个带有一些聚合函数的查询,检索信息大约需要10秒。我想要做的是将查询结果存储到redis中,并不时地由redis数据库更新来自neo4j的结果。
其中一项记录如下:
{ entry: "123", model: "abc", reactants: [{specie: "abc@12", color: "black"}], .... }
我正在使用node.js和快递,谢谢您的关注
更新:我的查询是相当广泛的,我必须做‘展开’部分,才能通过反应物搜索(我也想要产品,但我不知道怎么做)。我不知道是否有可能被优化到至少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}'
发布于 2015-11-24 07:37:53
最简单的方法是将来自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;
红葡萄酒会处理到期,这样你就不用了。
如果要全部存储,可以将它们存储在列表或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列表上设置过期时间。
https://stackoverflow.com/questions/33897513
复制