为什么过滤器中的OR逻辑会使密码查询运行得更快?

时间:2016-02-26 23:09:12

标签: neo4j cypher

我对neo4j中的密码有一个有趣的问题。当我在没有“OR”逻辑的查询中使用过滤器(WHERE)时,使用带有“OR”逻辑的过滤器需要更长的时间。

例如: 以下查询给出了从2010年到2012年底入院的患者 通过急诊科诊断为RSV(初诊)和哮喘(继发诊断)。

1 -

MATCH  (d:Diagnosis)-[r2:SC_EXISTS_IN]->(e:Encounter)<-[r3:PATIENT_HAS]-(p:Person)
WHERE (d.DIAG='49300_diag' OR 
d.DIAG='49301_diag' OR d.DIAG='49302_diag' OR d.DIAG='49310_diag' OR d.DIAG='49311_diag' OR d.DIAG='49312_diag' OR  
d.DIAG='49320_diag' OR d.DIAG='49321_diag' OR d.DIAG='49322_diag' OR d.DIAG='49381_diag' OR d.DIAG='49382_diag' OR 
d.DIAG='49390_diag' OR d.DIAG='49391_diag' OR d.DIAG='49392_diag') AND 
( e.ADMIT_YEAR='2012' or e.ADMIT_YEAR='2011' or e.ADMIT_YEAR='2010' ) 
WITH e,p
MATCH (d2:Diagnosis)-[r5:PR_EXISTS_IN]->(e)-[VISIT_TYPE_IS]->(t:Type)
WHERE (t.TYPE='1_outptype') AND d2.DIAG='0796_diag'
RETURN count(distinct p), count(distinct e);

2 -

MATCH  (d:Diagnosis)-[r2:SC_EXISTS_IN]->(e:Encounter)<-[r3:PATIENT_HAS]-(p:Person)
WHERE (d.DIAG='49300_diag' OR 
d.DIAG='49301_diag' OR d.DIAG='49302_diag' OR d.DIAG='49310_diag' OR d.DIAG='49311_diag' OR d.DIAG='49312_diag' OR  
d.DIAG='49320_diag' OR d.DIAG='49321_diag' OR d.DIAG='49322_diag' OR d.DIAG='49381_diag' OR d.DIAG='49382_diag' OR 
d.DIAG='49390_diag' OR d.DIAG='49391_diag' OR d.DIAG='49392_diag') AND 
( e.ADMIT_YEAR='2012' or e.ADMIT_YEAR='2011' or e.ADMIT_YEAR='2010' ) 
WITH e,p
MATCH (d2:Diagnosis)-[r5:PR_EXISTS_IN]->(e)-[VISIT_TYPE_IS]->(t:Type)
WHERE (t.TYPE='1_outptype' OR t.TYPE='1_outptype') AND d2.DIAG='0796_diag'
RETURN count(distinct p), count(distinct e);

它们之间的唯一区别是在查询中添加了一个额外的OR逻辑(t.TYPE ='1_outptype')。此时,第一个查询在大约5秒内执行,而第二个查询执行大约0.1秒。我尝试了其他查询,并且“OR”逻辑主要使查询运行得更快。

为什么在neo4j?

1 个答案:

答案 0 :(得分:1)

我认为你所看到的是冷缓存与温暖缓存。 如果以相反的顺序运行两个查询,您应该看到相反的情况。

否则以PROFILE为前缀运行查询并共享输出。

并使用Brian的建议使用

  1. 参数
  2. t.DIAG IN {diags}
  3. 同样适用于ADMIT_YEAR
  4. 并确保DIAG有唯一约束,ADMIT_YEAR
  5. 索引