我有一个大小为Neo4j
的{{1}}数据库。它具有70Gb
个数据集,它们具有相同的结构,只是不同的节点。下面介绍的一个简单的Cypher查询从一个数据集中检索一些数据需要永远运行。数据集中没有那么多节点,只有几千个。这是查询:
8
总共存在大量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
属性并且没有将其作为一种索引这一事实相关。可以做些什么来加快查询速度?
答案 0 :(得分: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所提到的:PROFILE
和EXPLAIN
可以随时帮助您了解您的查询的作用以及它是否符合您的期望。看看at the docs。