2016-02-26 42 views
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?

+0

您可以通過在每個查詢的開頭添加「PROFILE」來比較查詢計劃。 –

+4

善良,使用'd.DIAG IN ['49300_diag','49301_diag','49302_diag',等等]'! –

回答

1

我想你看到的是冷藏與溫暖的藏品。 如果以相反順序運行這兩個查詢,則應該看到相反的結果。

否則以前綴PROFILE運行您的查詢並共享輸出。

並使用Brian的建議,使用

  1. 參數
  2. t.DIAG IN {} DIAGS
  3. 同爲ADMIT_YEAR
  4. ,並確保有用於DIAG唯一約束和索引ADMIT_YEAR