我对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?
答案 0 :(得分:1)
我认为你所看到的是冷缓存与温暖缓存。 如果以相反的顺序运行两个查询,您应该看到相反的情况。
否则以PROFILE为前缀运行查询并共享输出。
并使用Brian的建议使用