知識圖譜基礎之RDF,RDFS與OWL

對知識圖譜有興趣的讀者能夠關注個人知乎專欄,主要介紹知識圖譜的相關概念、技術,也包含一些具體實踐。java

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

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

SPO編程

RDF由節點和邊組成,節點表示實體/資源、屬性,邊則表示了實體和實體之間的關係以及實體和屬性的關係。在第一篇文章中(爲何須要知識圖譜?什麼是知識圖譜?——KG的前世此生),咱們結合羅納爾多的例子,介紹了RDF節點和邊的類型約束,這裏再也不贅述。對RDF不熟悉的讀者,能夠參考第一篇文章,裏面有更直觀的描述和解釋。
RDF序列化方法瀏覽器

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

RDF/XML,顧名思義,就是用XML的格式來表示RDF數據。之因此提出這個方法,是由於XML的技術比較成熟,有許多現成的工具來存儲和解析XML。然而,對於RDF來講,XML的格式太冗長,也不便於閱讀,一般咱們不會使用這種方式來處理RDF數據。app

N-Triples,即用多個三元組來表示RDF數據集,是最直觀的表示方法。在文件中,每一行表示一個三元組,方便機器解析和處理。開放領域知識圖譜DBpedia一般是用這種格式來發布數據的。框架

Turtle, 應該是使用得最多的一種RDF序列化方式了。它比RDF/XML緊湊,且可讀性比N-Triples好。dom

RDFa, 即「The Resource Description Framework in Attributes」,是HTML5的一個擴展,在不改變任何顯示效果的狀況下,讓網站構建者可以在頁面中標記實體,像人物、地點、時間、評論等等。也就是說,將RDF數據嵌入到網頁中,搜索引擎可以更好的解析非結構化頁面,獲取一些有用的結構化信息。讀者能夠去這個頁面感覺一下RDFa,其直觀展現了普通用戶看到的頁面,瀏覽器看到的頁面和搜索引擎解析出來的結構化信息。編程語言

JSON-LD,即「JSON for Linking Data」,用鍵值對的方式來存儲RDF數據。感興趣的讀者能夠參考此網站。

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

羅納爾多知識圖譜

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.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

用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 :address "-22.908333, -43.196389"^^string.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

同一個實體擁有多個屬性(數據屬性)或關係(對象屬性),咱們能夠只用一個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;
            :address "-22.908333, -43.196389"^^string.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

即,將一個實體用一個句子表示(這裏的句子指的是一個英文句號「.」)而不是多個句子,屬性間用分號隔開。
RDF的表達能力

在第二篇文章(語義網絡,語義網,連接數據和知識圖譜)當中咱們提到,RDF的表達能力有限,沒法區分類和對象,也沒法定義和描述類的關係/屬性。個人理解是,RDF是對具體事物的描述,缺少抽象能力,沒法對同一個類別的事物進行定義和描述。就以羅納爾多這個知識圖爲例,RDF可以表達羅納爾多和里約熱內盧這兩個實體具備哪些屬性,以及它們之間的關係。但若是咱們想定義羅納爾可能是人,里約熱內盧是地點,而且人具備哪些屬性,地點具備哪些屬性,人和地點之間存在哪些關係,這個時候RDF就表示無能爲力了。不管是在智能的概念上,仍是在現實的應用當中,這種泛化抽象能力都是至關重要的;同時,這也是知識圖譜自己十分強調的。RDFS和OWL這兩種技術或者說模式語言/本體語言(schema/ontology language)解決了RDF表達能力有限的困境。
2、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 .

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49

咱們這裏只介紹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在知識圖譜中所表明的層面,咱們用下面的圖來表示例子中的數據層和模式層。

RDFS

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 .

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50

schema層的描述語言換爲OWL後,層次圖表示爲:
OWL

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

羅納爾多這個例子不能展示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在推理方面的能力。知識圖譜的推理主要分爲兩類:基於本體的推理和基於規則的推理。

咱們這裏談的是基於本體的推理。讀者應該發現,上面所介紹的屬性特徵詞彙其實就創造了對RDF數據進行推理的前提。此時,咱們加入支持OWL推理的推理機(reasoner),就可以執行基於本體的推理了。RDFS一樣支持推理,因爲缺少豐富的表達能力,推理能力也不強。舉個例子,咱們用RDFS定義人和動物兩個類,另外,定義人是動物的一個子類。此時推理機可以推斷出一個實體如果人,那麼它也是動物。OWL固然支持這種基本的推理,除此以外,憑藉其強大的表達能力,咱們能進行更有實際意義的推理。想象一個場景,咱們有一個龐大數據庫存儲人物的親屬關係。裏面不少關係都是單向的,好比,其只保存了A的父親(母親)是B,但B的子女字段裏面沒有A,以下表。
personNotation     hasParent     hasChild
A     B     
B         

若是在只有單個關係,數據量很少的狀況下,咱們尚能人工的去補全這種關係。若是在關係種類上百,人物上億的狀況下,咱們如何處理?當進行關係修改,添加,刪除等操做的時候,該怎麼處理?這種場景想一想就會讓人崩潰。若是咱們用inversOf來表示hasParent和hasChild互爲逆關係,上面的數據能夠表示爲:

inverse

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

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

    OWL 2/EL 使用場景:本體結構中有大量相互連接的類和屬性,設計者想用自動推理機獲得裏面複雜的關係。
    OWL 2/QL 使用場景:有大量的實例數據。OWL 2 QL本體能夠被改寫爲SQL查詢,適用於使用OBDA(ontology based data access)的方式來訪問關係數據庫。也就是說咱們不用顯式地把關係數據庫中的數據轉爲RDF,而是經過映射的方式,將數據庫轉爲虛擬RDF圖進行訪問。
    OWL 2/RL 使用場景:須要結合基於規則的推理引擎(rule-based reasoning engine)的場合。

3、總結

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

    blog: Learn rdf     blog: Learn owl and rdfs     W3C: RDFS 1.1     W3C: OWL overview     W3C: OWL2 overview     Exploiting Linked Data and Knowledge Graphs in Large Organisations

相關文章
相關標籤/搜索