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