【1.9.3】RDF简介

用于信息交互的语言住哟啊需哟啊包含三个部分:

  • 数据模型
  • 语义
  • 语法

在目前的框架中,这些部分分别由这些标准构成:

  • 数据模型:RDF(Resource Description Framework)
  • 语义: RDFS (RDFSchema), OWL (Web Ontology Language)
  • 语法: Turtle /TriG /RDF-XML

(注:RDF有时作为上述全部的统称)

一、RDF

RDF(Resource Description Framework),即资源描述框架,其本质是一个数据模型(Data Model)。它提供了一个统一的标准,用于描述实体/资源。简单来说,就是表示事物的一种方法和手段。RDF形式上表示为SPO三元组,有时候也称为一条语句(statement),知识图谱中我们也称其为一条知识,如下图。

RDF由节点和边组成,节点表示实体/资源、属性,边则表示了实体和实体之间的关系以及实体和属性的关系。

RDF所做的,是刻画和传输一个数据模型,让机器也理解我们想要表达的意思。 让机器理解语义的方法是,我们规定一些特定词汇,用这些词汇来表达特定的语义。这个词汇表就是RDF Schema。可以看出,RDF Schema与RDF,是不能和XML Schema和XML进行类比的。

  • RDF是语义Web的核心数据模型,也是所有其他语义Web技术的基础。
  • RDF图是一个带有标签的有向图,图是指“点和线”,而不是“图表”
  • 可将RDF视为通过节点和边都有标签的边(线)相互连接的一组节点(点) 图形的节点是椭圆形和矩形,边缘被标记为箭头,将节点彼此连接起来。
  • 标签是URI(统一资源标识符)

为了更加深刻的了解RDF,RDFS,OWL的概念,区别;我们在这里先翻译一段stackoverflow上的解释:

  • RDF是一个概念 。这里的RDF就是我们用三元组描述事物的方式
  • RDF也是一个词典的名字 。词典中有很多词汇,比如- rdf: resource, rdf:description等等,我们在下面会详细介绍每个词语怎么用,这些词汇让我们更加方便的对事物进行建模。词汇的具体含义参见:https://www.w3.org/1999/02/22-rdf-syntax-ns
  • RDFS是另外一个词典的名字 。这个词典中的词汇主要帮助你描述类的关系。词汇的具体含义参见:https://www.w3.org/2000/01/rdf-schema#
  • OWL是一个更强大的词典的名字。让你创建更加复杂的模型

1.1 RDF的基本概念

statements = 对象(资源) + 属性(特殊的资源) + 值(资源或者字符串)

其中:

  1. 资源:打算谈论的事物。每个资源都有一个唯一的URI(通用资源标识符)来定位。
  2. 属性:一种特殊的资源(所以也有对应的URI),来描述资源之间的关系。

RDF图的三种节点:

  • 资源节点:资源是任何可以说明事情的东西。在视图表示中资源由椭圆表示。
  • 文字节点:详细说明。在视图表示中文字节点用矩形表示。
  • 空白节点:一个空白节点是一个没有URI的资源。

1.2 RDF序列化方法

RDF的表示形式和类型有了,那我们如何创建RDF数据集,将其序列化(Serialization)呢?换句话说,就是我们怎么存储和传输RDF数据??目前,RDF序列化的方式主要有:RDF/XML,N-Triples,Turtle,RDFa,JSON-LD等几种。

有向图

N-Triples

  • 用多个三元组来表示RDF数据集,是最直观的表示方法
  • 在文件中,每一行表示一个三元组,方便机器解析和处理
  • 开放领域知识图谱DBpedia通常是用这种格式来发布数据的

例子

(http://www.cit.gu.edu.au/_db, http://www.mydomain.org/siteowner, #David Billington)

Turtle

  • 应该是使用得最多的一种RDF序列化方式了
  • 比RDF/XML紧凑,且可读性比N-Triples好

RDFa

  • The Resource Description Framework in Attributes 是HTML5的一个扩展
  • 在不改变任何显示效果的情况下,让网站构建者能够在页面中标记实体,像人物、地点、时间、评论等等
  • 将RDF数据嵌入到网页中,搜索引擎能够更好的解析非结构化页面,获取一些有用的结构化信息

JSON-LD

JSON for Linking Data

键值对的方式来存储RDF数据

示例

from [https://json-ld.org/](https://json-ld.org/)
 {

"@context": "[https://json-ld.org/contexts/person.jsonld](https://json-ld.org/contexts/person.jsonld)",
"@id": "[http://dbpedia.org/resource/John_Lennon](http://dbpedia.org/resource/John_Lennon)",
"name": "John Lennon",
"born": "1940-10-09",
"spouse": "[http://dbpedia.org/resource/Cynthia_Lennon](http://dbpedia.org/resource/Cynthia_Lennon)"
}

XML

就是用XML的格式来表示RDF数据

XML的技术比较成熟,有许多现成的工具来存储和解析XML

对于RDF来说,XML的格式太冗长,也不便于阅读,通常我们不会使用这种方式来处理RDF数据

<? xml version="1.0" encoding="UTF-16">
<rdf:RDF
    xmlns: rdf="http://www.w3.org/1999/01/22-rdf-syntax-ns#"
    xmlns: mydomain="http://www.mydomain.org/my-rdf-ns">
<rdf: Description rdf: about="http://www.cit.gu.edu.au/~db">
    <mydomain: site-owner>
        David Billington
    </mydomain: site-owner>
</rdf: Description>
</rdf: RDF>

1.3 基于XML的RDF语法

一个RDF文档由一个rdf: RDF元素构成,其内容是一系列描述。其第一部分是命名空间,第二部分才表示RDF的三元组语句,具体的例子见上面的XML表示。rdf:Description 后面开始被描述的对象,用rdf:about来说明描述的东西是什么,后面的内容成为属性元素,是一些属性-值的二元组,用来描述。

rdf主要元素

rdf:Description

rdf:Description 元素可通过 about 属性新定义一个资源。例如

<rdf: Description rdf: about="http://www.cit.gu.edu.au/~db">

属性元素

在标识完这个资源之后,我们用一些(标签-值)的配对来描述这个资源。例如

<mydomain: site-owner>David Billington</mydomain: site-owner>

当(标签-值)中的值是一个资源时,用一个空的XML元素+rdf:resource标签来表示。例如

<rdf:Description
 rdf:about="http://www.recshop.fake/cd/Empire Burlesque">
  <cd:artist rdf:resource="http://www.recshop.fake/cd/dylan" />
</rdf:Description>

rdf:type用来表示父类子类的关系

<rdf:Description rdf:about="cs15213">
  <rdf:type rdf:resource="uni:course">
  <uni:courseName>Computer System</uni:courseName>
</rdf:Description>

rdf容器

值有可能不是一个,而是一系列。比如,一堂课的授课教师可能是很多个。这时,他们的可以用容器表示。

  1. rdf: Bag 无需容器
  2. rdf: Seq 有序容器
  3. rdf: Alt 多选一

一个例子:

<?xml version="1.0"?>

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:cd="http://www.recshop.fake/cd#">

<rdf:Description
 rdf:about="http://www.recshop.fake/cd/Beatles">
 <cd:artist>    
   <rdf:Seq>
     <rdf:li>George</rdf:li>
     <rdf:li>John</rdf:li>
     <rdf:li>Paul</rdf:li>
     <rdf:li>Ringo</rdf:li>
   </rdf:Seq>
  </cd:artist>
</rdf:Description>

</rdf:RDF>

1.4 RDF和RDFS的公理语义

四大常量及其关系

  • class
  • resource
  • property
  • literal

这个class是所有具体的class的个父类。比如动物类,植物类都是class的子类。同样的,这四大常量也都是class的子类。 而一切所有皆资源(resource):所有类(class)都是资源,所有属性(property)都是资源,所有literal都是资源。

三元组的其他两种表示

属性是一个类的两种表示方法:

  1. PropVal(type, Property, Class)
  2. Type(Property, Class)

二、RDFS

之所以说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,即“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定义了“人”和“地点”这两个类。

@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几个比较重要,常用的词汇:

rdfs:Class. 用于定义类。

rdf:type 用来表示主语是谓语的一个实例,主语是一个资源,谓语是一个类 例如:Type(村上春树, 作家)

rdfs:subClassOf 用来表示主语是谓语的子类,主语和谓语都是一个类 例如:subClassOf(猫, 动物) 推理规则:如果A是B的子类,那么所有A的对象一定是B的对象。也就是猫是动物,那么波斯猫,中华田园猫都是动物。

rdfs:subPropertyOf 用来表示主语是谓语的子属性,主语和谓语都是属性 例如:subPropertyOf(在清华大学当教授,在清华大学工作) 推理规则:如果A是B的子属性,那么两个满足属性A的对象一定满足属性B。也就是小明在清华大学当教授,那么小明一定在清华大学工作。

rdfs:domain 。用来表示属性的定义域 , 例如domain(教课,老师),就是在教课这个属性里,主语一定是老师。

rdfs:range 用于描述该属性的取值类型。 例如range(教课, 课程),就是在教课这个属性里,谓语一定是课程。

其实rdf:Property和rdf:type也是RDFS的词汇,因为RDFS本质上就是RDF词汇的一个扩展。我们在这里不罗列进去,是不希望读者混淆。RDFS其他的词汇及其用法请参考W3C官方文档。

为了让读者更直观地理解RDF和RDFS/OWL在知识图谱中所代表的层面,我们用下面的图来表示例子中的数据层和模式层。

Data层是我们用RDF对罗纳尔多知识图的具体描述,Vocabulary是我们自己定义的一些词汇(类别,属性),RDF(S)则是预定义词汇。从下到上是一个具体到抽象的过程。图中我们用红色圆角矩形表示类,绿色字体表示rdf:type,rdfs:domain,rdfs:range三种预定义词汇,虚线表示rdf:type这种所属关系。另外,为了减少图中连线的交叉,我们只保留了career这一个属性的rdf:type所属关系,省略了其他属性的此关系。 我的理解:

  1. rdf:type 即说明出发点是目的地的一种。也就代表了 是…的类型的关系
  2. rdf:domain 说明出发点是目的地的一种属性。也就代表了 是….的一种属性的意思
  3. rdf:range 说明该属性的取值类型。 也就代表了 是…的值的关系

三、RDFS的扩展——OWL

上面我们提到,RDFS本质上是RDF词汇的一个扩展。后来人们发现RDFS的表达能力还是相当有限,因此提出了OWL。我们也可以把OWL当做是RDFS的一个扩展,其添加了额外的预定义词汇。 OWL,即“Web Ontology Language”,语义网技术栈的核心之一。OWL有两个主要的功能:

提供快速、灵活的数据建模能力。 高效的自动推理。

我们先谈如何利用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后,层次图表示为:

数据属性用青色表示,对象属性由蓝色表示。 罗纳尔多这个例子不能展现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 .

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn