1
我有一個關於neo4j中的密碼的有趣問題。當我在沒有「OR」邏輯的查詢中使用過濾器(WHERE)時,比使用「OR」邏輯使用過濾器花費的時間更長。爲什麼過濾器中的OR邏輯使得密碼查詢運行得更快?
例如: 下面的查詢給出了通過診斷爲RSV(初級診斷)和哮喘(二級診斷)的急診科從2010年到2012年底入院的患者 。
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?
您可以通過在每個查詢的開頭添加「PROFILE」來比較查詢計劃。 –
善良,使用'd.DIAG IN ['49300_diag','49301_diag','49302_diag',等等]'! –