电影KB-QA 3
通過前面幾篇文章的介紹,讀者應(yīng)該對知識圖譜,其相關(guān)概念,以及語義網(wǎng)技術(shù)棧中的RDF,RDFS/OWL有了一定的了解。
者準備開一個實踐篇,結(jié)合理論篇,讓讀者能夠從無到有構(gòu)建一個領(lǐng)域知識圖譜,并在其上搭建一個基于知識圖譜的問答小程序。demo比較簡單,問答實現(xiàn)是基于模板匹配和正則表達式,整個流程是為了讓讀者對知識圖譜及其相關(guān)應(yīng)用有個直觀的認識。
首先介紹我們使用的數(shù)據(jù)、數(shù)據(jù)來源和數(shù)據(jù)獲取方法;其次,基于數(shù)據(jù)內(nèi)部關(guān)系,介紹如何以自頂向下的方式構(gòu)建本體結(jié)構(gòu)。
一、數(shù)據(jù)準備
實踐篇使用的數(shù)據(jù)是與電影相關(guān)的。基本統(tǒng)計數(shù)據(jù)如下:
演員數(shù)量:505人
電影數(shù)量:4518部
電影類型:19類
人物與電影的關(guān)系:14451
電影與類型的關(guān)系:7898
演員的基本信息包括:姓名、英文名、出生日期、死亡日期、出生地、個人簡介。
電影的基本信息包括:電影名稱、電影簡介、電影評分、電影發(fā)行日期、電影類型。
數(shù)據(jù)是從“The Movie Database (TMDb”網(wǎng)站獲取的,官方提供注冊用戶API KEY用于查詢和下載數(shù)據(jù)。
本實例數(shù)據(jù)獲取方法:以周星馳為初始入口,獲取其出演的所有電影;再獲取這些電影的所有參演演員;最后獲取所有參演演員所出演的全部電影。經(jīng)過去重處理,我們得到了505個演員的基本信息和4518部電影的基本信息。數(shù)據(jù)保存在mysql中,其ER圖如下:
二、本體建模
本體的構(gòu)建大體有兩種方式:自頂向下和自底向上。
開放域知識圖譜的本體構(gòu)建通常用自底向上的方法,自動地從知識圖譜中抽取概念、概念層次和概念之間的關(guān)系。這也很好理解,開放的世界太過復(fù)雜,用自頂向下的方法無法考慮周全,且隨著世界變化,對應(yīng)的概念還在增長。
領(lǐng)域知識圖譜多采用自頂向下的方法來構(gòu)建本體。一方面,相對于開放域知識圖譜,領(lǐng)域知識圖譜涉及的概念和范圍都是固定或者可控的;另一方面,對于領(lǐng)域知識圖譜,我們要求其滿足較高的精度。現(xiàn)在大家接觸到的一些語音助手背后對接的知識圖譜大多都是領(lǐng)域知識圖譜,比如音樂知識圖譜、體育知識圖譜、烹飪知識圖譜等等。正因為是這些領(lǐng)域知識圖譜來滿足用戶的大多數(shù)需求,更需要保證其精度。
本實例是一個電影領(lǐng)域的知識圖譜,我們采用自頂向下的方法來構(gòu)建本體結(jié)構(gòu)。首先介紹下我們使用的工具protégé:
Protégé,又常常簡單地拼寫為“Protege”,是一個斯坦福大學(xué)開發(fā)的本體編輯和知識獲取軟件。開發(fā)語言采用Java,屬于開放源碼軟件。由于其優(yōu)秀的設(shè)計和眾多的插件,Protégé已成為目前使用最廣泛的本體論編輯器之一(來自維基百科)。
這樣我們就定義好了本體
關(guān)系數(shù)據(jù)庫到RDF
上一篇文章介紹了我們所使用的數(shù)據(jù)。
其實,知識圖譜數(shù)據(jù)的來源主要有三個:結(jié)構(gòu)化數(shù)據(jù)、半結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化的數(shù)據(jù)。我們所使用的電影數(shù)據(jù)就是結(jié)構(gòu)化的數(shù)據(jù)。半結(jié)構(gòu)化的數(shù)據(jù)指的是數(shù)據(jù)有一定的組織形式,但較結(jié)構(gòu)化數(shù)據(jù)而言更松散(屬性名和屬性值具有多樣性,比如“生日”就有“出生日期”、“誕辰”等多種表達方式),例如百度百科、維基百科、互動百科等;非結(jié)構(gòu)化數(shù)據(jù)通常是指我們看到的一切純文本數(shù)據(jù)。
本文首先介紹W3C的RDB2RDF工作小組制定的兩個標準,用于將關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)轉(zhuǎn)換為RDF格式的數(shù)據(jù)。然后介紹如何利用d2rq這個工具把我們Mysql中的數(shù)據(jù)轉(zhuǎn)為RDF。
一、兩個標準
第一個標準是direct mapping,即直接映射。
規(guī)則十分簡單:
數(shù)據(jù)庫的表作為本體中的類(Class)。比如我們在mysql中保存的數(shù)據(jù),一共有5張表。那么通過映射后,我們的本體就有5個類了,而不是我們自己定義的三個類。
表的列作為屬性(Property)。
表的行作為實例/資源。
表的單元格值為字面量
如果單元格所在的列是外鍵,那么其值為IRI,或者說實體/資源。
RDB2RDF工作小組指定了另外一個標準——R2RML,可以讓用戶更靈活的編輯和設(shè)置映射規(guī)則。
R2RML也支持SQL語句來對查詢結(jié)果進行映射。比如,我們有一列表示某人的性別,我們可以用SQL語句選取男性的行,把這些行映射成我們定義的男性類。女性同理。這種特性大大增強了其靈活性。
二、D2RQ
主要功能是將MySQL數(shù)據(jù)轉(zhuǎn)換為RDF
以虛擬RDF圖的方式訪問關(guān)系數(shù)據(jù)庫是其最主要的一個特性。它的機理就是通過mapping文件,把對RDF的查詢等操作翻譯成SQL語句,最終在RDB上實現(xiàn)對應(yīng)操作。在做知識圖譜項目的時候,我們可以靈活地選擇數(shù)據(jù)訪問方式。當對外提供服務(wù),查詢操作比較頻繁的情況下,最好是將RDB的數(shù)據(jù)直接轉(zhuǎn)為RDF,會節(jié)省很多SPARQL到SQL的轉(zhuǎn)換時間。
D2RQ發(fā)布了r2rml-kit以支持W3C制定的兩個映射標準。D2RQ有一個比較方便的地方,可以根據(jù)你的數(shù)據(jù)庫自動生成預(yù)定義的mapping文件,用戶可以在這個文件上修改,把數(shù)據(jù)映射到自己的本體上。就我們這個例子而言,數(shù)據(jù)關(guān)系比較簡單,自己編輯R2RML文件或者在D2RQ生成的mapping文件上修改效率差不多。在數(shù)據(jù)關(guān)系很復(fù)雜的時候,我建議直接在D2RQ生成的mapping文件上修改,會節(jié)省很多時間。
使用步驟
./generate-mapping -u root -p sdzh521 -o kg_demo_movie_mapping.ttl jdbc:mysql:///kg_demo_movie
root是mysql的用戶名,沒有密碼則不輸入,-o指定輸出文件路徑及名稱,jdbc:mysql:///kg_demo_movie 指定我們要映射的數(shù)據(jù)庫。該命令的其他參數(shù)及使用方式請參考文檔。
@prefix : http://www.kgdemo.com# .
d2rq:class :Genre;
將其中的表名換為本體中的數(shù)據(jù)
./dump-rdf -f TURTLE -o dump.nt kg_demo_movie_mapping.ttl
RDF查詢語言SPARQL
前面我們已經(jīng)介紹過了語義網(wǎng)技術(shù)棧中的RDF,RDFS/OWL。這次我們介紹最后一個核心技術(shù)標準——SPARQL(RDF,OWL和SPARQL稱為語義網(wǎng)的三大核心技術(shù))。RDF本質(zhì)上是一種數(shù)據(jù)模型,那么我們?nèi)绾卧赗DF上進行查詢呢?類似使用SQL查詢關(guān)系數(shù)據(jù)庫,我們使用SPARQL查詢RDF格式的數(shù)據(jù)。本文先簡單介紹一下SPARQL的歷史,然后結(jié)合我們實踐篇的數(shù)據(jù)舉幾個具體的例子。
一、SPARQL
SPARQL即SPARQL Protocol and RDF Query Language的遞歸縮寫,專門用于訪問和操作RDF數(shù)據(jù),是語義網(wǎng)的核心技術(shù)之一。W3C的RDF數(shù)據(jù)存取小組(RDF Data Access Working Group, RDAWG)對其進行了標準化。相對第一個版本,其支持RDF圖的更新,提供更強大的查詢,比如:子查詢、聚合操作(像我們常用的count)等等。
從SPARQL的全稱我們可以知道,其由兩個部分組成:協(xié)議和查詢語言
一個SPARQL查詢本質(zhì)上是一個帶有變量的RDF圖,以我們之前提到的羅納爾多RDF數(shù)據(jù)為例:
http://www.kg.com/person/1 http://www.kg.com/ontology/chineseName “羅納爾多·路易斯·納薩里奧·德·利馬”^^string.
我們把屬性值用變量代替(SPARQL中,用問號加變量名的方式來表示一個變量。),即:
http://www.kg.com/person/1 http://www.kg.com/ontology/chineseName ?x.
SPARQL查詢是基于圖匹配的思想。我們把上述的查詢與RDF圖進行匹配,找到符合該匹配模式的所有子圖,最后得到變量的值。就上面這個例子而言,在RDF圖中找到匹配的子圖后,將"羅納爾多·路易斯·納薩里奧·德·利馬"和“?x”綁定,我們就得到最后的結(jié)果。簡而言之,SPARQL查詢分為三個步驟:
構(gòu)建查詢圖模式,表現(xiàn)形式就是帶有變量的RDF。
匹配,匹配到符合指定圖模式的子圖。
綁定,將結(jié)果綁定到查詢圖模式對應(yīng)的變量上。
二、例子
以實踐篇的RDF電影數(shù)據(jù)為例,我們介紹如何利用SPARQL查詢:
如何查詢所有數(shù)據(jù)?參照我們在第一個部分介紹的查詢過程,查詢所有數(shù)據(jù)即我們沒有任何已知值,SPO三元組每個都是未知變量。對應(yīng)的SPARQL查詢語言為:
SPARQL的部分關(guān)鍵詞:
SELECT, 指定我們要查詢的變量。在這里我們查詢所有的變量,用*代替。
WHERE,指定我們要查詢的圖模式。含義上和SQL的WHERE沒有區(qū)別。
FROM,指定查詢的RDF數(shù)據(jù)集。我們這里只有一個圖,因此省去了FROM關(guān)鍵詞。
PREFIX,用于IRI的縮寫。
“周星馳出演了哪些電影”:
PREFIX : <http://www.kgdemo.com#> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX xsd: <XML Schema> PREFIX vocab: <http://localhost:2020/resource/vocab/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX map: <http://localhost:2020/resource/#> PREFIX db: <http://localhost:2020/resource/>SELECT ?n WHERE {?s rdf:type :Person.?s :personName '周星馳'.?s :hasActedIn ?o.?o :movieTitle ?n }總結(jié)
- 上一篇: FFmpeg网络传输协议
- 下一篇: Verilog实现状态机与状态机经典示例