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。這些都會隨着更深入的查詢而惡化。
有沒有辦法避免查詢中的循環,從而減少查詢時間?
我正在使用版本2.3.0-M01。 AUI上有一個索引。使用獨特的id(x)可顯着加快查詢速度。但是,它並沒有解決圓形的根本問題。而且,我需要的不僅僅是節點ID,因爲基本目標是節點之間語義和關係類型的輸出(UMLS概念)。 –
你檢查了重複的路徑嗎? Cypher在單個路徑上使用關係唯一性,但不跨多個路徑。所以它不會在內部返回循環路徑,但是幾條路徑可能會導致相同的終端節點。 –
我想你已經抓住了問題的本質。通過重複,我認爲你的意思是出現在單一路徑中的同一個節點。通過手動檢查輸出,我可以看到這種情況正在發生。我如何在密碼中解決這個問題?我已經試過 MATCH路徑=(N:MRCONSO {AUI: 'A3684559'})< - [R * 1..3] - (x)的RETURN收集(不同X) 但這也有很長的運行時間。 –