李若宇,陳 磊
(淮南師范學院 計算機學院,安徽 淮南 232001)
隨著2020 年暴發(fā)的新冠肺炎疫情席卷全球,各種疾病知識已經(jīng)成為最有價值的信息之一,建立高質(zhì)量的疾病知識庫,有助于推進醫(yī)學現(xiàn)代化,推進全民醫(yī)學知識科普。 現(xiàn)階段傳統(tǒng)主流數(shù)據(jù)庫以關(guān)系型數(shù)據(jù)庫為主,在存儲結(jié)構(gòu)化數(shù)據(jù)時具有成熟的技術(shù)和良好的性能,但疾病知識擁有著明顯的樹狀結(jié)構(gòu)和拓撲結(jié)構(gòu)特征,傳統(tǒng)關(guān)系型數(shù)據(jù)庫難以做到高效的存儲。
資源描述框架(Resource Description Framework,RDF)是Web3.0 時代語義網(wǎng)技術(shù)中的一個概念,表達為一種基于圖的數(shù)據(jù)類型,常作為知識圖譜的存儲介質(zhì)。 選用RDF 進行疾病知識描述和倉儲具有查詢效率高、擴展性強、對非結(jié)構(gòu)化非關(guān)系型數(shù)據(jù)兼容性較好等特點。 國內(nèi)外基于RDF 技術(shù)開發(fā)的知識庫有清華大學的Xlore、復旦大學的CN-Dbpedia、谷歌的Freebase 和維基的DBPedia。 Openlink 公司的Virtuoso 數(shù)據(jù)庫能夠?qū)崿F(xiàn)RDF 數(shù)據(jù)的倉儲,并使用SPARQL 語句進行數(shù)據(jù)的檢索和操作[1-2]。
作為語義網(wǎng)中的核心技術(shù),使用RDF 構(gòu)建知識工程時,知識本體被當作資源表示為URI,不同資源間的聯(lián)系以主謂賓的形式進行描述,形成知識圖譜。 構(gòu)成RDF 的數(shù)據(jù)類型包括:(1)URI。 用于標記資源,以網(wǎng)址的形式。 如在疾病知識中,知識本體“高血壓”被標記為資源:
表1 RDF 原生數(shù)據(jù)形式
疾病知識具有明顯的醫(yī)學知識特征,有較規(guī)則的知識結(jié)構(gòu),例如大多數(shù)疾病都包含中英文名稱、就診科室、多發(fā)群體、病癥分類、常見癥狀、診斷方法、治療方法等共同屬性,因此根據(jù)屬性關(guān)系可以對疾病知識進行有效組織。 對疾病知識進行建模的步驟包括:(1)收集知識文檔。 可以從網(wǎng)絡百科、電子書籍等相對準確的資料上收集資料,注意可以采用爬蟲的方式,但是需要對知識的準確性進行人工驗核。 (2)抽取主要屬性。根據(jù)對大多數(shù)疾病知識的研究,歸納通用疾病屬性,建立數(shù)據(jù)字典。
在圖1 中,唯一編號的ds125 表示知識本體“冠心病”,ds125 下包含有一級屬性中文名、英文名、多發(fā)人群、就診科室、癥狀、治療方法、檢查方法。 值得注意的是,雖然RDF 數(shù)據(jù)模型中的屬性名類似于關(guān)系模型中的字段名,但這里的屬性名可自由搭配屬性值,如屬性“檢查方法”可以連接一個值,也可以連接若干個值。
圖1 知識本體“冠心病”的RDF 數(shù)據(jù)模型
完成知識內(nèi)容建模以后,需要將知識內(nèi)容轉(zhuǎn)化為RDF 描述,轉(zhuǎn)化工作包括拼接前綴、格式化等工作,產(chǎn)出的結(jié)果應該是規(guī)范的RDF 三元組文檔。
值得注意的是,賓語除了字面量以外,還可能是資源類型。 如“檢查方法”對應的屬性值這里表示為資源而非字串字面量,一方面,因為具體“檢查方法”更趨向于是一個術(shù)語,符合被定義成為RDF 中的資源;另一方面,一種“檢查方法”可能被多種疾病共享,如“心電圖”可以是多種疾病的“檢查方法”,這時與將“心電圖”作為“檢查方法”的疾病資源便建立了聯(lián)系。 如圖2 所示,讓數(shù)據(jù)實體之間(ds125 和ds126)建立豐富的聯(lián)系,體現(xiàn)關(guān)聯(lián)數(shù)據(jù)語義網(wǎng)的核心理念。
圖2 通過同一種檢查方法連接起來的兩個疾病實體
RDF 數(shù)據(jù)具有明顯的“圖”結(jié)構(gòu),需要使用圖數(shù)據(jù)庫進行組織和存儲,單純的關(guān)系型數(shù)據(jù)庫并不便于存儲RDF 數(shù)據(jù)。 Openlink Virtuoso 數(shù)據(jù)庫支持以圖的形式存儲RDF 數(shù)據(jù),支持使用SPARQL 語句對RDF 數(shù)據(jù)進行DML 和DQL 操作,兼容主流操作系統(tǒng),支持JDBC,ODBC,HTTP API 等主流數(shù)據(jù)訪問接口和多種編程語言,在海量數(shù)據(jù)存儲和處理方面有著不錯的表現(xiàn),同時還支持將關(guān)系數(shù)據(jù)轉(zhuǎn)換為RDF 數(shù)據(jù)的技術(shù)(RDB2RDF)。 除了Openlink Virtuoso 以外,MarkLogic,Jena,GraphDB 等數(shù)據(jù)庫在RDF 數(shù)據(jù)倉儲方面都有著優(yōu)秀特性[5]。
知識倉儲在這里主要指將組織好的RDF 數(shù)據(jù)存儲至數(shù)據(jù)庫,在將RDF 數(shù)據(jù)導入Virtuoso 數(shù)據(jù)庫時,常常采用SPARQL-Update 語句的方式進行。
(1)在Virtuoso 數(shù)據(jù)庫的namespace 定義命名空間和對應的前綴,有助于減小輸入冗余。
@prefix knt:
@prefix kna:
此時知識本體可被表示為knt:ds125,屬性可以被表示為kna:屬性。
(2)SPARQL 語句支持RDF 縮寫形式,下面是相同主語和相同主謂兩種情況下的縮寫示例。 INSERT 語句同SQL 中,表示將數(shù)據(jù)插入數(shù)據(jù)庫,
如圖3 所示,將寫好的SPARQL 語句插入Database>Interactive SQL 頁面中的輸入框,即可完成SPARQLUpdate 語句執(zhí)行,RDF 數(shù)據(jù)插入成功以后,數(shù)據(jù)庫系統(tǒng)會返回被更改的條目數(shù)量。
RDF 數(shù)據(jù)的查詢是通過SPARQL-Query 語句執(zhí)行的,可以對已經(jīng)構(gòu)建好的疾病知識內(nèi)容進行檢索。 進入Virtuoso 數(shù)據(jù)庫,先后進入Linked Data 標簽和SPARQL 標簽,即可執(zhí)行正確的SPARQL 語句。 如圖3所示的SPARQL 語句在單機Execute 按鈕后,可檢索按照上述規(guī)則構(gòu)建的“冠心病”的相關(guān)知識[6]。
圖3 對“冠心病”的知識進行搜索
繼續(xù)使用SPARQL 語句:SELECT ? s ? o FROM
圖4 對庫中所有疾病名稱進行搜索
例如通過SPARQL 語句:SELECT COUNT(? s)FROM
文中以疾病知識的描述和倉儲為研究對象,介紹了RDF 技術(shù)原理,針對疾病知識特點進行分析和建模形成RDF 圖,隨后進行RDF 描述形成有效的RDF 文檔,在Windows 平臺對Virtuoso 數(shù)據(jù)庫進行部署,使用SPARQL 語言實現(xiàn)RDF 數(shù)據(jù)的導入和檢索,并簡要介紹了一些RDF 數(shù)據(jù)庫管理操作,如圖管理、命名空間管理等。 未來還可以使用Virtuoso 數(shù)據(jù)庫的編程接口,實現(xiàn)疾病知識應用的設計與開發(fā)。