Neo4j效率问题:Cypher查询永远运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Neo4j效率问题:Cypher查询永远运行相关的知识,希望对你有一定的参考价值。

我有一个大小~Neo4j70Gb数据库。它有8数据集,它们具有相同的结构,只是不同的节点。下面介绍的一个简单的Cypher查询从一个数据集中检索一些数据需要永远运行。数据集中没有那么多节点,只有几千个。这是查询:

MATCH (c:Cell)-[ex:EXPRESSES]->(g:Gene)
WHERE c.DATASET = "cd1_e165" AND g.geneName = "1010001B22Rik" 
RETURN c.tsneX, c.tsneY, ex.expr, c.cellId

总共存在大量的:EXPRESSES关系,但如果我们仅限于c.DATASET,我相信它应该更快地运行。也许这个问题在某种程度上与我在每个c.DATASET都有:Cell属性这一事实有关,而不是将它作为一种索引。可以做些什么来加快查询速度?

答案

首先,您应该在两个属性上使用索引。

 CREATE INDEX ON :Cell(DATASET);
 CREATE INDEX ON :Gene(geneName);  

接下来我会像这样重写查询(不确定这是否会有所帮助,但这对我来说更有意义,而且cypher的行为通常就像你期望的那样,在这种情况下,似乎很清楚它应该使用索引而不是开始搜索所有可能的路径):

MATCH (c:Cell{DATASET:'cd1_e165'})-[ex:EXPRESSES]->(g:Gene{geneName:'1010001B22Rik'})
RETURN c.tsneX, c.tsneY, ex.expr, c.cellId

正如InverseFalcon所提到的:PROFILEEXPLAINcan总能帮助您了解您的查询的作用以及它是否符合您的期望。看看at the docs

以上是关于Neo4j效率问题:Cypher查询永远运行的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j/Cypher 测试数据请求

Neo4j - Cypher vs Gremlin 查询语言

在 Neo4J 中监控 CYPHER 查询性能

Neo4j Cypher 中有多个不相关的查询?

Neo4j 第三篇:Cypher查询入门

Spring Data Neo4j (4.2.0M1) 计数 Cypher 查询返回类型不同于嵌入式数据库而不是远程数据库