Neo4j 当我想找到从一个节点到另一个节点的路径时,如何优化密码?
我想优化cypher,因为它太慢了,无法得到结果 我的代码是:Neo4j 当我想找到从一个节点到另一个节点的路径时,如何优化密码?,neo4j,cypher,Neo4j,Cypher,我想优化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
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
我该怎么办
更新一:
我的代码的配置文件是
密码版本:密码3.5,计划员:成本,运行时:解释。86876729在53454毫秒内的总数据库命中率。有一些方法可以提高查询的性能。
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
您是否可以在开始时添加PROFILE
,然后在MATCH
之前运行您的查询并共享扩展的查询计划?您好,@Raj。我已经在问题中添加了结果。您的数据库中的所有节点的计数是多少?您好,@Raj。所有节点的计数是230000,所有关系的计数是13000000。您好,@拉杰,我试过了,但没用。我还能做什么?○| ̄|_您是否也为其他标签创建了索引?此外,您的查询中没有关系方向,您可以添加这些并更新上述查询吗?是的,数据库中的name
上有10个索引,因为节点的类别数为10。我无法这样做,因为我想查找两个节点之间的所有关系。