【问题标题】:How to optimize cypher when I want to find a path from a node to another?当我想找到从一个节点到另一个节点的路径时如何优化密码?
【发布时间】:2019-09-17 03:51:35
【问题描述】:

我想优化 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

Cypher 版本:CYPHER 3.5,规划器:COST,运行时:INTERPRETED。 86876729 总 db hits in 53454 ms。

【问题讨论】:

  • 您能否通过在MATCH 之前的开头添加PROFILE 来运行查询并共享扩展的查询计划?
  • 嗨,@Raj。我已在问题中添加了结果。
  • 你的数据库中所有节点的数量是多少?
  • 嗨,@Raj.所有节点的数量是230,000,所有关系的数量是13,000,000。

标签: neo4j cypher


【解决方案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

【讨论】:

  • 嗨,@Raj。我尝试了它们,但没有任何帮助。我还能做什么? ○| ̄|_
  • 您是否也为其他标签创建了索引?
  • 另外,您的查询中没有关系方向,您可以添加这些并更新上述查询吗?
  • 是的,数据库中name上有10个索引,因为节点的类别数是10。
  • 我不能这样做,因为我想找到两个节点之间的所有关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2017-05-15
  • 2013-04-26
相关资源
最近更新 更多