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

问题描述 投票:0回答:1

我有一个大小~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属性这一事实有关,而不是将它作为一种索引。可以做些什么来加快查询速度?

performance neo4j cypher
1个回答
1
投票

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

 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

© www.soinside.com 2019 - 2024. All rights reserved.