我想优化密码,因为它太慢而无法获得结果。
我的代码是:
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
是
密码版本:CYPHER 3.5,计划程序:COST,运行时间:INTERPRETED。在53454毫秒内总共命中了86876729个数据库。
答案 0 :(得分:1)
有一些方法可以改善查询的性能。
1。在name
属性上创建索引:
对其他标签也执行相同操作。
CREATE INDEX ON :GeneEntity(name)
2。匹配时使用标签(此处为e0
和e3
):考虑使用标签来减少要扫描的节点。如果不使用标签,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