当我想找到一个节点到另一个节点的路径时,如何优化密码?

时间:2019-04-28 06:59:41

标签: neo4j cypher

我想优化密码,因为它太慢而无法获得结果。

我的代码是:

MATCH (e0{name:"dacomitinib"})-[r01]-(e1)-[r12]-(e2)-[r23]-(e3{name:"rucaparib camsylate"})
WHERE (e1:GeneEntity or e1:CompoundEntity or e1:DrugsEntity or e1:DiseaseEntity or e1:ProteinEntity) 
and (e2:GeneEntity or e2:CompoundEntity or e2:DrugsEntity or e2:DiseaseEntity or e2:ProteinEntity) 
RETURN e0.name,r01.confidence,e1.name,r12.confidence,e2.name,r23.confidence,e3.name

我该怎么办?

更新一个:

我的代码的PROFILE

enter image description here

密码版本:CYPHER 3.5,计划程序:COST,运行时间:INTERPRETED。在53454毫秒内总共命中了86876729个数据库。

1 个答案:

答案 0 :(得分:1)

有一些方法可以改善查询的性能。

1。在name属性上创建索引:

对其他标签也执行相同操作。

CREATE INDEX ON :GeneEntity(name)

2。匹配时使用标签(此处为e0e3:考虑使用标签来减少要扫描的节点。如果不使用标签,Neo4j将比较所有节点。

解决方案:

  

您的查询在内部产生了AllNodesScan。   AllNodesScan这是个坏主意!。

更好的解决方案可能是:

MATCH (e0{name:"dacomitinib"}), (e3{name:"rucaparib camsylate"})
WITH e0, e3 
MATCH (e0)-[r01]-(e1)-[r12]-(e2)-[r23]-(e3) 
WHERE  
    head(labels(e1)) IN ['GeneEntity','CompoundEntity','DrugsEntity','DiseaseEntity','ProteinEntity'] 
    AND 
    head(labels(e2)) IN ['GeneEntity','CompoundEntity','DrugsEntity','DiseaseEntity','ProteinEntity'] 
RETURN e0.name, r01.confidence, e1.name, r12.confidence, e2.name, r23.confidence, e3.name