【轉】知識圖譜基礎知識3:知識圖譜基礎之RDF,RDFS與OWL

看過之前兩篇文章(1, 2)的讀者應該對RDF有了一個大致的認識和理解。本文將結合實例,對RDF和RDFS/OWL,這兩種知識圖譜基礎技術作進一步的介紹。其實,RDF、RDFS/OWL是類語義網概念背后通用的基本技術,而知識圖譜是其中最廣為人知的概念。

一、知識圖譜的基石:RDF

RDF表現形式

RDF(Resource Description Framework),即資源描述框架,其本質是一個數據模型(Data Model)。它提供了一個統一的標準,用于描述實體/資源。簡單來說,就是表示事物的一種方法和手段。RDF形式上表示為SPO三元組,有時候也稱為一條語句(statement),知識圖譜中我們也稱其為一條知識,如下圖。

image

RDF由節點和邊組成,節點表示實體/資源、屬性,邊則表示了實體和實體之間的關系以及實體和屬性的關系。在第一篇文章中(為什么需要知識圖譜?什么是知識圖譜?——KG的前世今生),我們結合羅納爾多的例子,介紹了RDF節點和邊的類型約束,這里不再贅述。對RDF不熟悉的讀者,可以參考第一篇文章,里面有更直觀的描述和解釋。

RDF序列化方法

RDF的表示形式和類型有了,那我們如何創建RDF數據集,將其序列化(Serialization)呢?換句話說,就是我們怎么存儲和傳輸RDF數據。目前,RDF序列化的方式主要有:RDF/XML,N-Triples,Turtle,RDFa,JSON-LD等幾種。

  1. RDF/XML,顧名思義,就是用XML的格式來表示RDF數據。之所以提出這個方法,是因為XML的技術比較成熟,有許多現成的工具來存儲和解析XML。然而,對于RDF來說,XML的格式太冗長,也不便于閱讀,通常我們不會使用這種方式來處理RDF數據。
  2. N-Triples,即用多個三元組來表示RDF數據集,是最直觀的表示方法。在文件中,每一行表示一個三元組,方便機器解析和處理。開放領域知識圖譜DBpedia通常是用這種格式來發布數據的。
  3. Turtle, 應該是使用得最多的一種RDF序列化方式了。它比RDF/XML緊湊,且可讀性比N-Triples好。
  4. RDFa, 即“The Resource Description Framework in Attributes”,是HTML5的一個擴展,在不改變任何顯示效果的情況下,讓網站構建者能夠在頁面中標記實體,像人物、地點、時間、評論等等。也就是說,將RDF數據嵌入到網頁中,搜索引擎能夠更好的解析非結構化頁面,獲取一些有用的結構化信息。讀者可以去這個頁面感受一下RDFa,其直觀展示了普通用戶看到的頁面,瀏覽器看到的頁面和搜索引擎解析出來的結構化信息。
  5. JSON-LD,即“JSON for Linking Data”,用鍵值對的方式來存儲RDF數據。感興趣的讀者可以參考此網站。

下面,我們結合第一篇文章中羅納爾多知識圖的例子,給出其N-Triples和Turtle的具體表示。

image
Example1 N-Triples:

<http://www.kg.com/person/1> <http://www.kg.com/ontology/chineseName> "羅納爾多·路易斯·納薩里奧·德·利馬"^^string.
<http://www.kg.com/person/1> <http://www.kg.com/ontology/career> "足球運動員"^^string.
<http://www.kg.com/person/1> <http://www.kg.com/ontology/fullName> "Ronaldo Luís Nazário de Lima"^^string.
<http://www.kg.com/person/1> <http://www.kg.com/ontology/birthDate> "1976-09-18"^^date.
<http://www.kg.com/person/1> <http://www.kg.com/ontology/height> "180"^^int.
<http://www.kg.com/person/1> <http://www.kg.com/ontology/weight> "98"^^int.
<http://www.kg.com/person/1> <http://www.kg.com/ontology/nationality> "巴西"^^string.
<http://www.kg.com/person/1> <http://www.kg.com/ontology/hasBirthPlace> <http://www.kg.com/place/10086>.
<http://www.kg.com/place/10086> <http://www.kg.com/ontology/address> "里約熱內盧"^^string.
<http://www.kg.com/place/10086> <http://www.kg.com/ontology/coordinate> "-22.908333, -43.196389"^^string.

用Turtle表示的時候我們會加上前綴(Prefix)對RDF的IRI進行縮寫。

Example2 Turtle:

@prefix person: <http://www.kg.com/person/> .
@prefix place: <http://www.kg.com/place/> .
@prefix : <http://www.kg.com/ontology/> .

person:1 :chineseName "羅納爾多·路易斯·納薩里奧·德·利馬"^^string.
person:1 :career "足球運動員"^^string.
person:1 :fullName "Ronaldo Luís Nazário de Lima"^^string.
person:1 :birthDate "1976-09-18"^^date.
person:1 :height "180"^^int. 
person:1 :weight "98"^^int.
person:1 :nationality "巴西"^^string. 
person:1 :hasBirthPlace place:10086.
place:10086 :address "里約熱內盧"^^string.
place:10086 :coordinate "-22.908333, -43.196389"^^string.

同一個實體擁有多個屬性(數據屬性)或關系(對象屬性),我們可以只用一個subject來表示,使其更緊湊。我們可以將上面的Turtle改為:

Example3 Turtle:

@prefix person: <http://www.kg.com/person/> .
@prefix place: <http://www.kg.com/place/> .
@prefix : <http://www.kg.com/ontology/> .

person:1 :chineseName "羅納爾多·路易斯·納薩里奧·德·利馬"^^string;
         :career "足球運動員"^^string;
         :fullName "Ronaldo Luís Nazário de Lima"^^string;
         :birthDate "1976-09-18"^^date;
         :height "180"^^int;
         :weight "98"^^int;
         :nationality "巴西"^^string; 
         :hasBirthPlace place:10086.
place:10086 :address "里約熱內盧"^^string;
            :coordinate "-22.908333, -43.196389"^^string.

即,將一個實體用一個句子表示(這里的句子指的是一個英文句號“.”)而不是多個句子,屬性間用分號隔開。

RDF的表達能力

在第二篇文章(語義網絡,語義網,鏈接數據和知識圖譜)中我們提到,RDF的表達能力有限,無法區分類和對象,也無法定義和描述類的關系/屬性。我的理解是,RDF是對具體事物的描述,缺乏抽象能力,無法對同一個類別的事物進行定義和描述。就以羅納爾多這個知識圖為例,RDF能夠表達羅納爾多和里約熱內盧這兩個實體具有哪些屬性,以及它們之間的關系。但如果我們想定義羅納爾多是人,里約熱內盧是地點,并且人具有哪些屬性,地點具有哪些屬性,人和地點之間存在哪些關系,這個時候RDF就表示無能為力了。不論是在智能的概念上,還是在現實的應用當中,這種泛化抽象能力都是相當重要的;同時,這也是知識圖譜本身十分強調的。RDFS和OWL這兩種技術或者說模式語言/本體語言(schema/ontology language)解決了RDF表達能力有限的困境。

二、RDF的“衣服”——RDFS/OWL

之所以說RDFS/OWL是RDF的“衣服”,因為它們都是用來描述RDF數據的。為了不顯得這么抽象,我們可以用關系數據庫中的概念進行類比。用過Mysql的讀者應該知道,其database也被稱作schema。這個schema和我們這里提到的schema language十分類似。我們可以認為數據庫中的每一張表都是一個類(Class),表中的每一行都是該類的一個實例或者對象(學過java等面向對象的編程語言的讀者很容易理解)。表中的每一列就是這個類所包含的屬性。如果我們是在數據庫中來表示人和地點這兩個類別,那么為他們分別建一張表就行了;再用另外一張表來表示人和地點之間的關系。RDFS/OWL本質上是一些預定義詞匯(vocabulary)構成的集合,用于對RDF進行類似的類定義及其屬性的定義。

Notice: RDFS/OWL序列化方式和RDF沒什么不同,其實在表現形式上,它們就是RDF。其常用的方式主要是RDF/XML,Turtle。另外,通常我們用小寫開頭的單詞或詞組來表示屬性,大寫開頭的表示類。數據屬性(data property,實體和literal字面量的關系)通常由名詞組成,而對象數據(object property,實體和實體之間的關系)通常由動詞(has,is之類的)加名詞組成。剩下的部分符合駝峰命名法。為了將它們表示得更清楚,避免讀者混淆,之后我們都會默認這種命名方式。讀者實踐過程中命名方式沒有強制要求,但最好保持一致。

輕量級的模式語言——RDFS

RDFS,即“Resource Description Framework Schema”,是最基礎的模式語言。還是以羅納爾多知識圖為例,我們在概念、抽象層面對RDF數據進行定義。下面的RDFS定義了人和地點這兩個類,及每個類包含的屬性。

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix : <http://www.kg.com/ontology/> .

### 這里我們用詞匯rdfs:Class定義了“人”和“地點”這兩個類。
:Person rdf:type rdfs:Class.
:Place rdf:type rdfs:Class.

### rdfs當中不區分數據屬性和對象屬性,詞匯rdf:Property定義了屬性,即RDF的“邊”。
:chineseName rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:career rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:fullName rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:birthDate rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:date .

:height rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:int .

:weight rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:int .

:nationality rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:hasBirthPlace rdf:type rdf:Property;
        rdfs:domain :Person;
        rdfs:range :Place .

:address rdf:type rdf:Property;
        rdfs:domain :Place;
        rdfs:range xsd:string .

:coordinate rdf:type rdf:Property;
        rdfs:domain :Place;
        rdfs:range xsd:string .

我們這里只介紹RDFS幾個比較重要,常用的詞匯:

1. rdfs:Class. 用于定義類。

2. rdfs:domain. 用于表示該屬性屬于哪個類別。

3. rdfs:range. 用于描述該屬性的取值類型。

4. rdfs:subClassOf. 用于描述該類的父類。比如,我們可以定義一個運動員類,聲明該類是人的子類。

5. rdfs:subProperty. 用于描述該屬性的父屬性。比如,我們可以定義一個名稱屬性,聲明中文名稱和全名是名稱的子類。

其實rdf:Property和rdf:type也是RDFS的詞匯,因為RDFS本質上就是RDF詞匯的一個擴展。我們在這里不羅列進去,是不希望讀者混淆。RDFS其他的詞匯及其用法請參考W3C官方文檔。

為了讓讀者更直觀地理解RDF和RDFS/OWL在知識圖譜中所代表的層面,我們用下面的圖來表示例子中的數據層和模式層。

image

Data層是我們用RDF對羅納爾多知識圖的具體描述,Vocabulary是我們自己定義的一些詞匯(類別,屬性),RDF(S)則是預定義詞匯。從下到上是一個具體到抽象的過程。圖中我們用紅色圓角矩形表示類,綠色字體表示rdf:type,rdfs:domain,rdfs:range三種預定義詞匯,虛線表示rdf:type這種所屬關系。另外,為了減少圖中連線的交叉,我們只保留了career這一個屬性的rdf:type所屬關系,省略了其他屬性的此關系。

RDFS的擴展——OWL

上面我們提到,RDFS本質上是RDF詞匯的一個擴展。后來人們發現RDFS的表達能力還是相當有限,因此提出了OWL。我們也可以把OWL當做是RDFS的一個擴展,其添加了額外的預定義詞匯。

OWL,即“Web Ontology Language”,語義網技術棧的核心之一。OWL有兩個主要的功能:

1. 提供快速、靈活的數據建模能力。

2. 高效的自動推理。

我們先談如何利用OWL進行數據建模。用OWL對羅納爾多知識圖進行語義層的描述:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix : <http://www.kg.com/ontology/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .

### 這里我們用詞匯owl:Class定義了“人”和“地點”這兩個類。
:Person rdf:type owl:Class.
:Place rdf:type owl:Class.

### owl區分數據屬性和對象屬性(對象屬性表示實體和實體之間的關系)。詞匯owl:DatatypeProperty定義了數據屬性,owl:ObjectProperty定義了對象屬性。
:chineseName rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:career rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:fullName rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:birthDate rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:date .

:height rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:int .

:weight rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:int .

:nationality rdf:type owl:DatatypeProperty;
        rdfs:domain :Person;
        rdfs:range xsd:string .

:hasBirthPlace rdf:type owl:ObjectProperty;
        rdfs:domain :Person;
        rdfs:range :Place .

:address rdf:type owl:DatatypeProperty;
        rdfs:domain :Place;
        rdfs:range xsd:string .

:coordinate rdf:type owl:DatatypeProperty;
        rdfs:domain :Place;
        rdfs:range xsd:string .

schema層的描述語言換為OWL后,層次圖表示為:

image

數據屬性用青色表示,對象屬性由藍色表示。

羅納爾多這個例子不能展現OWL豐富的表達能力,我們這里簡單介紹一下常用的詞匯:

描述屬性特征的詞匯

1. owl:TransitiveProperty. 表示該屬性具有傳遞性質。例如,我們定義“位于”是具有傳遞性的屬性,若A位于B,B位于C,那么A肯定位于C。

2. owl:SymmetricProperty. 表示該屬性具有對稱性。例如,我們定義“認識”是具有對稱性的屬性,若A認識B,那么B肯定認識A。

3. owl:FunctionalProperty. 表示該屬性取值的唯一性。 例如,我們定義“母親”是具有唯一性的屬性,若A的母親是B,在其他地方我們得知A的母親是C,那么B和C指的是同一個人。

4. owl:inverseOf. 定義某個屬性的相反關系。例如,定義“父母”的相反關系是“子女”,若A是B的父母,那么B肯定是A的子女。

本體映射詞匯(Ontology Mapping)

1. owl:equivalentClass. 表示某個類和另一個類是相同的。

2. owl:equivalentProperty. 表示某個屬性和另一個屬性是相同的。

3. owl:sameAs. 表示兩個實體是同一個實體。

本體映射主要用在融合多個獨立的Ontology(Schema)。舉個例子,張三自己構建了一個本體結構,其中定義了Person這樣一個類來表示人;李四則在自己構建的本體中定義Human這個類來表示人。當我們融合這兩個本體的時候,就可以用到OWL的本體映射詞匯。回想我們在第二篇文章中提到的Linked Open Data,如果沒有OWL,我們將無法融合這些知識圖譜。

<http://www.zhangsan.com/ontology/Person> rdf:type owl:Class .
<http://www.lisi.com/ontology/Human> rdf:type owl:Class .
<http://www.zhangsan.com/ontology/Person> owl:equivalentClass <http://www.lisi.com/ontology/Human> .

更多的OWL詞匯和特性請參考[W3C官網文檔](OWL Web Ontology Language Overview)。

接下來我們談一下OWL在推理方面的能力。知識圖譜的推理主要分為兩類:基于本體的推理和基于規則的推理。

我們這里談的是基于本體的推理。讀者應該發現,上面所介紹的屬性特征詞匯其實就創造了對RDF數據進行推理的前提。此時,我們加入支持OWL推理的推理機(reasoner),就能夠執行基于本體的推理了。RDFS同樣支持推理,由于缺乏豐富的表達能力,推理能力也不強。舉個例子,我們用RDFS定義人和動物兩個類,另外,定義人是動物的一個子類。此時推理機能夠推斷出一個實體若是人,那么它也是動物。OWL當然支持這種基本的推理,除此之外,憑借其強大的表達能力,我們能進行更有實際意義的推理。想象一個場景,我們有一個龐大數據庫存儲人物的親屬關系。里面很多關系都是單向的,比如,其只保存了A的父親(母親)是B,但B的子女字段里面沒有A,如下表。

image

如果在只有單個關系,數據量不多的情況下,我們尚能人工的去補全這種關系。如果在關系種類上百,人物上億的情況下,我們如何處理?當進行關系修改,添加,刪除等操作的時候,該怎么處理?這種場景想想就會讓人崩潰。如果我們用inversOf來表示hasParent和hasChild互為逆關系,上面的數據可以表示為:

image

綠色的關系表示是我們RDF數據中真實存在的,紅色的關系是推理得到的。通過這個例子,相信讀者應該初步了解了OWL的推理功能和能力。

目前,OWL的最新版本是OWL 2,在兼容OWL的基礎上添加了新的功能,有興趣的讀者可以查閱W3C文檔。另外,OWL 2包含了三個標準,或者三種配置(Profile),它們是OWL 2完整標準(OWL 2/Full)的一個子集。讀者目前不用考慮它們之間的差別,只有當我們要用到OWL自動推理功能的時候才需要考慮到底使用哪一種配置。且在大多數情況下,我們需要知道哪種配置才是最合適的。下面簡單說說它們使用的場景:

1. OWL 2/EL 使用場景:本體結構中有大量相互鏈接的類和屬性,設計者想用自動推理機得到里面復雜的關系。

2. OWL 2/QL 使用場景:有大量的實例數據。OWL 2 QL本體可以被改寫為SQL查詢,適用于使用OBDA(ontology based data access)的方式來訪問關系數據庫。也就是說我們不用顯式地把關系數據庫中的數據轉為RDF,而是通過映射的方式,將數據庫轉為虛擬RDF圖進行訪問。

3. OWL 2/RL 使用場景:需要結合基于規則的推理引擎(rule-based reasoning engine)的場合。

三、總結

本文主要介紹了RDF的序列化方式,如何利用RDFS/OWL進行schema層的建模,和OWL的推理功能。接下來我們將介紹如何根據現有的關系數據庫,利用protege自頂向下地構建自己的本體結構。

參考資料

  1. Learn RDF - Cambridge Semantics

  2. Learn OWL and RDFS - Cambridge Semantics

  3. RDF Schema 1.1

  4. OWL Web Ontology Language Overview

5.OWL 2 Web Ontology Language Document Overview (Second Edition)

6. Exploiting Linked Data and Knowledge Graphs in Large Organisations

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容