Neo4j效率问题:Cypher查询永远运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Neo4j效率问题:Cypher查询永远运行相关的知识,希望对你有一定的参考价值。
我有一个大小~Neo4j
的70Gb
数据库。它有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所提到的:PROFILE
和EXPLAIN
can总能帮助您了解您的查询的作用以及它是否符合您的期望。看看at the docs。
以上是关于Neo4j效率问题:Cypher查询永远运行的主要内容,如果未能解决你的问题,请参考以下文章
Neo4j - Cypher vs Gremlin 查询语言
Spring Data Neo4j (4.2.0M1) 计数 Cypher 查询返回类型不同于嵌入式数据库而不是远程数据库