2015-03-30 35 views
1

我開發了以下查詢來查找符合特定查詢條件的所有節點。具體來說,所有符合某些參數的疾病代碼。我已使用UNION在代碼中完成此操作:Neo4j - 從兩個獨立集合中查找節點之間關係的密碼語法

//Find all diagnosis codes 
MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept), 
     q = (c:ObjectConcept{sctid:58800005})<-[:ISA*]-(d:ObjectConcept) 
WHERE NOT (b)-->()--(c) AND NOT (b)-->()-->(d) 
RETURN distinct b 
UNION 
MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept), 
     t = (e:ObjectConcept{sctid:65119002})<-[:ISA*]-(f:ObjectConcept) 
WHERE NOT (b)-->()-->(e) AND NOT (b)-->()-->(f) 
RETURN distinct b 

我想關注此查詢的結果。這是一套(不同的b),並找到所有這些疾病的患者。

Pseudo-code: Match s = (nodes in distinct b) <-[:HAS_DX]- (z:Patient) 
RETURN distinct z 

但是,我不知道Cypher語法將一組不同的節點b帶到這個後續的查詢語句中。我正在使用Neo4j v 2.1.7。

謝謝

回答

1

此查詢是否適合您?

MATCH p = (a:ObjectConcept{sctid:233604007})<-[:ISA*]-(b:ObjectConcept)<-[:HAS_DX]-(z:Patient), 
     q = (c:ObjectConcept)<-[:ISA*]-(d:ObjectConcept) 
WHERE (c.sctid = 58800005 OR c.sctid = 65119002) AND NOT (b)-->()-->(c) AND NOT (b)-->()-->(d) 
RETURN DISTINCT z; 
+0

該查詢的邏輯將工作,但我看到兩個問題。首先,對所寫的路徑q的搜索遍歷整個模型,而不受c的限制,因此執行不必要的計算。其次,路徑搜索p是一個有趣的設計,需要以某種方式「統治」來限制與搜索無關的節點/邊的計算。我將不得不玩弄這些概念,因爲我確實看到了他們的優點。謝謝。 – 2015-03-31 13:50:16

0

以下查詢成功。它需要將所需輸出的所有方面都匹配到每個子查詢中,以使列標題完全相同。少於1秒添加到查詢時間。

MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept), 
     q = (c:ObjectConcept{sctid:58800005})<-[:ISA*]-(d:ObjectConcept) 
WHERE NOT (b)-->()--(c) AND NOT (b)-->()-->(d) 
with distinct b 
MATCH (t:Patient)-[:HAS_DX]-> (b) 
RETURN distinct t.patient_id,b.FSN 
UNION 
MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept), 
     t = (e:ObjectConcept{sctid:65119002})<-[:ISA*]-(f:ObjectConcept) 
WHERE NOT (b)-->()-->(e) AND NOT (b)-->()-->(f) 
with distinct b 
MATCH (t:Patient)-[:HAS_DX]-> (b) 
RETURN distinct t.patient_id,b.FSN; 
相關問題