張百平
(廣州醫科大學附屬第三醫院 廣州 510000)
從一個典型的醫療關系表結構中抽象出一個豐富的圖結構,圖數據庫方法可廣泛利用這種圖形表示。圖數據庫能夠直接處理各種查詢,否則就需要在規范化關系表中執行深度連接操作。這些查詢涉及醫療實體之間的關系,可以用于協同過濾以及為醫療保健提供個性化開發服務。圖數據庫可以處理這類查詢,并提供直觀的查詢表示和對數據的訪問。作為非規范化表的一種形式,圖數據庫可以避免生成和復制大量的表,為醫療系統提供一個低成本的數據管理框架。
關系數據庫(如Oracle和MySQL)在獲取重復的表格數據方面表現出色。盡管名稱中有“關系”一詞,但關系數據庫在存儲或表達存儲的數據元素之間關系方面卻效率很低。與關系數據庫不同,圖數據庫完全圍繞數據關系構建。圖數據庫不將關系視為模式結構,而將其視為數據。
對關系數據庫與圖數據庫(Neo4j)在數據結構、數據模型特征和查詢功能等方面進行比較[1],見表1,發現當數據之間的關聯度較高時,使用圖數據庫具有明顯的優勢。從數據模型、存儲方式、特性和查詢語言等方面分析多種NoSQL(不僅是SQL)數據庫與關系數據庫相比的優缺點[2],提出一個基于社交網絡的微基準,通過測試5個不同的數據庫(Dex、Neo4j、RDF-3X、Virtuoso和PostgreSQL)來比較不同數據管理模式[3]。

表1 圖數據庫與關系數據庫對比
在圖數據庫中查找相關節點比在關系數據庫模型中查找相關數據行更加有效。圖數據模型的靈活性允許添加新的節點和關系,而原始數據保持不變。以圖格式存儲數據允許用戶從不同角度查看相同數據和連接。數據和關系網絡有助于找到最佳路徑、模式匹配或提供建議。將數據從關系數據庫移至圖數據庫可以利用所有圖數據庫提供的優勢。
通常,門診電子病歷(Electronic Medical Record,EMR)數據由患者、疾病、醫生、檢驗檢查和藥品組成。這些數據之間存在著許多聯系。如果使用圖數據庫,可以更好地利用這些連接從海量醫療數據中做出更好的推斷。要處理不斷增長的連接數據,可以選擇Neo4j,這是一種針對關系管理而優化的非關系圖數據庫,以進行進一步的分析和決策。
將數據從關系數據庫映射到圖數據庫基本上是將關系表示從一個數據庫轉換到另一個數據庫,從表結構轉換到圖結構。關系數據庫表中的數據實體是行(包含列),圖數據庫中的數據實體是節點(包含屬性)。更具體地說,可以使用關系數據庫模型的外鍵來構建邊,從而將松散耦合的數據記錄轉換為高度有界的節點組。
Neo4j是一個屬性圖數據庫,使用圖的原生結構,即鄰接表進行存儲,便于快速處理關系[4]。Neo4j使用的是Cypher查詢語言,Cypher可以提供豐富、高效的表達式來描述關系查詢[5]。與其他圖查詢語言相比,Cypher語言具有良好的發展前景[6]。為了簡化圖分析的工作,筆者調查了幾個圖數據庫。基于數據庫對軟件可追溯性的適用性審查[7],最終選擇Neo4j作為研究對象。Cypher對具有不同特征的數據進行操作,這些操作是在圖的節點和邊上執行的,而不是在表、元組以及與主鍵或外鍵的關系上執行。
Neo4j圖數據庫建模是將任意域描述為節點和關系的連通圖的過程。與傳統關系型數據庫不同,Neo4j是一個無模式數據庫,這意味著在添加數據之前不需要定義表和關系。一個節點可以有任何屬性,任何節點都可以與其他節點相關聯。Neo4j數據庫的數據模型在所包含的數據中是隱式的,Neo4j數據建模是描述性的。Neo4j的主要優點是對圖數據庫建模和查詢的直觀方式。使用Neo4j對門診EMR關系型數據庫進行圖數據庫建模,患者、疾病、藥物及其之間關系將用Neo4j技術構建并存儲在Neo4j中。
第1步是識別數據實體類型,見圖1,有4種類型的數據實體:患者信息、藥品字典、國際疾病分類 (International Classification of Diseases, ICD)第10版、診療字典(LIS&RIS),每個表表示正在操作的不同類型的信息。

圖1 EMR數據庫關系數據模式的表結構邏輯關系
接下來需要找到這些實體之間的語義關系。這一步不太明顯,因為關系數據庫并不是將關系作為一級公民來處理。患者單次就診所產生的所有記錄,包括檢查處方、西藥處方、中藥處方、診療處方等都通過CASEHISID_CHR這個就診流水號直接或者間接串聯起來。當正確標識數據實體和關系時,可以為每個數據實體創建節點,為每個關系創建邊。在圖中找到并構建正確的邊是一項關鍵活動。這些步驟影響數據結構有效響應最終用戶問題的能力。包括將邏輯關系(外鍵)和隱式關系(公共屬性)轉換為物理存儲在圖數據結構中的顯式邊。使用Neo4j (帶標簽的)屬性圖模型,其基本結構包括實體(節點)、屬性(屬性)、標簽(類型),具有方向、開始節點和結束節點的關系(邊)。最終識別到的關系類型,見表2。

表2 EMR關系數據轉換為圖數據邊(關系)
在Intel(R)Xeon(R)6240 CPU@2.60 GHz(16處理器)、RAM 32 GB、Windows Server 2012 R2虛擬機服務器上,使用neo4j-community-4.3.6構建診療圖譜。圖數據庫除了可以執行強大的連接操作之外,Neo4j還允許用戶創建索引。索引可以在節點或邊的屬性上創建,一個索引單元可以指向多個圖模式單元,從而提高搜索效率。還可以在圖上創建新的關系,見表3。

表3 新建關系、數量、代碼及耗時
通過繪制表示數據中常見模式的圖形片段,可以將模型可視化,見圖2。

圖2 Neo4j診療圖譜節點及關系數據模式總覽
經過以上環節的構建,獲得患者診療圖譜節點和關系基本情況,見表4、表5。患者診療圖譜包含270 871個節點(4類標簽)和6 091 656個關系(10種關系類型)。

表4 診療圖譜節點總覽(個)

表5 診療圖譜關系類型及數量(個)
關系MedicalRecord記錄著患者就診時的詳細信息,包括既往史、現病史、體溫、發病時間、身份等基本情況。關系TCMP及WMP詳細記錄藥物處方的用法用量。NumofDiagnosis、NumberofTCM、NumberofWM、NumberofDT分別表示患者在一段時間內所患某疾病次數、服用某中藥次數、服用某西藥次數及所做某檢驗檢查項目次數。
Neo4j檢索結果的速度比關系數據庫快,比MySQL靈活。Neo4j在結構類型查詢方面的表現優于MySQL,在使用整數數據時比MySQL慢。Neo4j圖數據庫主要有5個構建塊:節點、屬性、關系、標簽和數據瀏覽器。圖數據庫擅長遍歷類型的查詢,從而促進對關聯概念鏈的探索。這種“連接發現”可以識別新的關系。Neo4j不需要連接或索引就可以很容易地檢索它的相鄰節點或關系細節。下面以單個患者為例,在Neo4j圖數據庫中以圖的形式展示患者ID為“0000001816”在某段時間的診療記錄,可視化其在某段時間所患疾病,見圖3。所做檢查及所用藥物情況類似。

圖3 患者“0000001816”某段時間所患疾病情況
查詢某些適應癥藥物的結果分析并可視化EMR中的規律與模式,見圖4。

圖4 某段時期內用于治療“雙相情感障礙”的藥物
歸納出對應于某一疾病或者某些疾病組合,醫生們通常習慣于開哪些藥。
基于醫學數據的特點,使用屬性圖數據庫Neo4j對EMR進行建模,實踐表明,該模型比關系數據庫模型具有更好的語義表達能力,能夠更清晰地表達數據內部的語義關系,滿足實際查詢需求,并具有關系數據庫模型無法實現的路徑發現功能。
大型醫療數據存儲庫是知識發現的來源。對這類存儲庫的有效分析通常需要對數據中的依賴關系有全面理解。知識圖譜與任務無關,創建相同的知識圖譜,可以用于許多不同的任務,甚至是機器學習之外的任務。知識圖譜作為異構知識學習的默認數據模型,使用圖數據庫表示和查詢疾病網絡。
本文使用Neo4j對醫療數據進行建模,簡潔直觀地表達數據之間關系。使用圖數據庫有利于醫療數據分析和可視化,未來將添加機器學習機制,創建基于圖數據庫的醫學推薦引擎。