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

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

我想优化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版本:CYPHER 3.5,规划器:COST,运行时间:解释。 86876729总db命中率为53454 ms。

neo4j cypher
1个回答
1
投票

有一些方法可以提高查询的性能。

1.在name财产上创建索引:

对其他标签也一样。

CREATE INDEX ON :GeneEntity(name)

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

解:

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

更好的解决方案可能是:

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
© www.soinside.com 2019 - 2024. All rights reserved.