2015-06-18 21 views
0

我有SNOMED概念節點之間裝入的Neo4j統一醫學語言系統(UMLS)本體和關係。任何兩個節點之間可以有多種類型的關係。 UAA的2015AA版本和我選擇的選項產生了1,256,982個SNOMED節點和2,258,642個關係。此查詢會導致預期的SNOMED根節點的21個子節點:的Neo4j避免圓形導致暗號查詢

MATCH (n:MRCONSO{AUI:'A3684559'}) match n<-[*..1]-x return count(*) 

增加查詢的深度會導致問題。此查詢產生3338行返回

MATCH (n:MRCONSO{AUI:'A3684559'}) match n<-[*..2]-x return id(x) 

有11行id不是唯一的。這也可以在此查詢這將導致3327行(3338-11)

MATCH (n:MRCONSO{AUI:'A3684559'}) match p=shortestpath(n<-[*..2]-x) return id(x) 

由此看出,我可以用最短路徑的唯一子節點的ID。但是,第二次和第三次查詢的查詢時間分別爲52ms和61745。這些都會隨着更深入的查詢而惡化。

有沒有辦法避免查詢中的循環,從而減少查詢時間?

回答

0

您使用的是哪個版本的Neo4j?嘗試更新到2.2.2

你能確定你爲什麼得到這些重複ID? 這可能是一個孩子到達在兩個層面上

而且您的查詢將同時輸出的1級和2名兒童。

你可以輸出某個重複ID的所有路徑嗎?

僅僅得到唯一的ID就足夠了嗎?然後你可以使用不同的。

MATCH (n:MRCONSO{AUI:'A3684559'}) 
MATCH (n)<-[*..2]-(x) 
RETURN distinct id(x) 

您對:MRCONSO(AUI)有任何的索引或約束?

+0

我正在使用版本2.3.0-M01。 AUI上有一個索引。使用獨特的id(x)可顯着加快查詢速度。但是,它並沒有解決圓形的根本問題。而且,我需要的不僅僅是節點ID,因爲基本目標是節點之間語義和關係類型的輸出(UMLS概念)。 –

+0

你檢查了重複的路徑嗎? Cypher在單個路徑上使用關係唯一性,但不跨多個路徑。所以它不會在內部返回循環路徑,但是幾條路徑可能會導致相同的終端節點。 –

+0

我想你已經抓住了問題的本質。通過重複,我認爲你的意思是出現在單一路徑中的同一個節點。通過手動檢查輸出,我可以看到這種情況正在發生。我如何在密碼中解決這個問題?我已經試過 MATCH路徑=(N:MRCONSO {AUI: 'A3684559'})< - [R * 1..3] - (x)的RETURN收集(不同X) 但這也有很長的運行時間。 –