知识图谱系列干货,理论+实践

电子说

1.3w人已加入

描述

作者为了不让读者一开始就接触比较冰冷生硬的概念刻板描述(后面尽量用更具体、准确的例子来表达),通过现实生活中的例子自然的引入知识图谱的概念。希望通过这种方式加深读者的印象和理解。为了减轻读者理解的负担,作者尽可能地避免引入过多的概念和技术细节,将其留到后续的文章进行介绍。

言归正传,本文主要分为三个部分。第一个部分介绍我们为什么需要知识图谱、知识图谱的相关概念及其形式化表示;第二个部分将详细介绍语义网络、语义网和链接数据等概念;最后,将结合实例对RDF和RDFS/OWL,这两种知识图谱基础技术作进一步的介绍。

KG的前世今生

▌一、看到的不仅仅是字符串

当你看见下面这一串文本你会联想到什么?

Ronaldo Luís Nazário de Lima

估计绝大多数中国人不明白上面的文本代表什么意思。没关系,我们看看它对应的中文:

罗纳尔多·路易斯·纳萨里奥·德·利马

这下大部分人都知道这是一个人的名字了,当然,不出什么意外,还是个外国人。但还是有一部分人不知道这个人具体是谁。下面是关于他的某张图片:

从这张图片我们又得到了额外信息,他是一位足球运动员。对足球不熟悉的可能还是对他没有什么印象。那么再看看下面这张图片:

我再加上当初那洗脑的广告词:“保护嗓子,请用金嗓子喉片。广西金嗓子!”。这下应该许多人都知道他是谁了,毕竟多年前被这洗脑的广告语摧残了很长一段时间。

之所以举这样一个例子,是因为,计算机一直面临着这样的困境——无法获取网络文本的语义信息。尽管近些年人工智能得到了长足的发展,在某些任务上取得超越人类的成绩,但离一台机器拥有一个两三岁小孩的智力这样一个目标还有一段距离。这距离的背后很大一部分原因是机器缺少知识。如同上面的例子,机器看到文本的反应和我们看到罗纳尔多葡萄牙语原名的反应别无二致。为了让机器能够理解文本背后的含义,我们需要对可描述的事物(实体)进行建模,填充它的属性,拓展它和其他事物的联系,即,构建机器的先验知识。就以罗纳尔多这个例子说明,当我们围绕这个实体进行相应的扩展,我们就可以得到下面这张知识图。

RDF

机器拥有了这样的先验知识,当它再次看到 Ronaldo Luís Nazário de Lima,它就会“想”:“这是一个名字叫 Ronaldo Luís Nazário de Lima 的巴西足球运动员。”这和我们人类在看到熟悉的事物,会做一些联想和推理是很类似的。

Notice:

需要说明的是,上面的知识图并不代表知识图谱的实际组织形式,相反,它还会让读者对知识图谱产生一定的误解。在下一个部分,我会给出这张图所包含内容在知识图谱中更形式化的表示。实际上,我看到许多介绍知识图谱的文章都喜欢给出此种类型的图,却又不给出相应的说明,这可能会让读者一开始就进入理解的误区。

Google 为了提升搜索引擎返回的答案质量和用户查询的效率,于2012年5月16日发布了知识图谱(Knowledge Graph)。有知识图谱作为辅助,搜索引擎能够洞察用户查询背后的语义信息,返回更为精准、结构化的信息,更大可能地满足用户的查询需求。Google 知识图谱的宣传语“things not strings” 给出了知识图谱的精髓,即,不要无意义的字符串,而是获取字符串背后隐含的对象或事物。还是以罗纳尔多为例,我们想知道罗纳尔多的相关信息(很多情况下,用户的搜索意图可能也是模糊的,这里我们输入的查询为“罗纳尔多”),在之前的版本,我们只能得到包含这个字符串的相关网页作为返回结果,然后不得不进入某些网页查找我们感兴趣的信息;现在,除了相关网页,搜索引擎还会返回一个“知识卡片”,包含了查询对象的基本信息和其相关的其他对象(C罗名字简称也为罗纳尔多,搜索引擎只是根据“罗纳尔多”的指代概率返回了“肥罗”这个罗纳尔多的基本资料,但也许你需要C罗的相关信息,那么搜索引擎把C罗这个实体作为备选项列出),如下图红色方框中的内容。如果我们只是想知道罗纳尔多的国籍、年龄、婚姻状况、子女信息,那么我们不用再做多余的操作。在最短的时间内,我们获取了最为简洁,最为准确的信息。

RDF

当然,这只是知识图谱在搜索引擎上的一部分应用场景。举这个例子也是为了表明,知识图谱这样一种概念、或者技术,它的诞生是符合计算机科学、互联网发展潮流的。关于知识图谱的更多应用,会在之后继续给出。

▌二、知识图谱的前世今生

通过上面这个例子,读者应该对知识图谱有了一个初步的印象,其本质是为了表示知识。其实知识图谱的概念并不新,它背后的思想可以追溯到上个世纪五六十年代所提出的一种知识表示形式——语义网络(Semantic Network)。语义网络由相互连接的节点和边组成,节点表示概念或者对象,边表示他们之间的关系(is-a关系,比如:猫是一种哺乳动物;part-of 关系,比如:脊椎是哺乳动物的一部分),如下图。在表现形式上,语义网络和知识图谱相似,但语义网络更侧重于描述概念与概念之间的关系,(有点像生物的层次分类体系——界门纲目科属种),而知识图谱则更偏重于描述实体之间的关联。

RDF

除了语义网络,人工智能的分支——专家系统,万维网之父 Tim Berners Lee于1998年提出的语义网(Semantic Web)和在2006年提出的关联数据(Linked Data)都和知识图谱有着千丝万缕的关系,可以说它们是知识图谱前身。

目前,知识图谱并没有一个标准的定义(gold standard definition)。我在这里借用一下“Exploiting Linked Data and Knowledge Graphs in Large Organisations”这本书对于知识图谱的定义:

A knowledge graph consists of a set of interconnected typed entities and their attributes.

即,知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个 SPO 三元组(Subject-Predicate-Object)。

RDF

在知识图谱中,我们用 RDF 形式化地表示这种三元关系。RDF(Resource Description Framework),即资源描述框架,是W3C制定的,用于描述实体/资源的标准数据模型。RDF 图中一共有三种类型,International Resource Identifiers(IRIs),blank nodes 和 literals。下面是 SPO 每个部分的类型约束:

Subject 可以是 IRI 或 blank node。

Predicate 是 IRI。

Object 三种类型都可以。

IRI 我们可以看做是 URI 或者 URL 的泛化和推广,它在整个网络或者图中唯一定义了一个实体/资源,和我们的身份证号类似。

literal 是字面量,我们可以把它看做是带有数据类型的纯文本,比如我们在第一个部分中提到的罗纳尔多原名可以表示为"Ronaldo Luís Nazário de Lima"^^xsd:string。

blank node 简单来说就是没有 IRI 和 literal 的资源,或者说匿名资源。关于其作用,有兴趣的读者可以参考 W3C 的文档,这里不再赘述。我个人认为 blank node的存在有点多余,不仅会给对 RDF 的理解带来额外的困难,并且在处理的时候也会引入一些问题。通常我更愿意用带有 IRI 的 node 来充当 blank node,行使其功能,有点类似 freebase 中 CVT(compound value type)的概念。最后的参考资料会给出一篇写 blank node 缺陷的博客,有兴趣的读者可以看一看。

那么“罗纳尔多的中文名是罗纳尔多·路易斯·纳扎里奥·达·利马”这样一个三元组用RDF形式来表示就是:

RDF

"www.kg.com/person/1"是一个 IRI,用来唯一的表示“罗纳尔多”这个实体。"kg:chineseName"也是一个 IRI,用来表示“中文名”这样一个属性。"kg:"是 RDF 文件中所定义的 prefix,如下所示。

@prefix kg:

即 kg:chineseName 其实就是

"http://www.kg.com/ontology/chineseName"  的缩写。

将上面的知识图用更正式的形式画出来:

RDF

我们其实可以认为知识图谱就包含两种节点类型,资源和字面量。借用数据结构中树的概念,字面量类似叶子节点,出度为0。现在读者应该知道为什么我会说之前那幅图不准确,并会误导大家对知识图谱的理解了吧。"罗纳尔多·路易斯·纳萨里奥·德·利马"作为字面量,是不能有指向外部节点的边的,况且之前的图并不能直观地体现知识图谱中资源/实体(用IRI表示)这样一个极其重要的概念。

▌三、总结

本文通过罗纳尔多这个例子引出了知识图谱的现实需求,继而给出了知识图谱的定义和相关概念,并介绍了知识图谱的 RDF 形式化表示。作为一篇科普文章,文中省略了许多技术细节。后续我会根据语义网技术栈(Semantic Web Stack,如下图)来介绍知识图谱实现过程中所需要的具体技术。另外,可能会结合实践,介绍如何利用关系型数据库中的数据来构建一个知识图谱,并搭建一个简易的基于知识图谱的问答系统(KBQA)。

RDF

语义网络,语义网,链接数据和知识图谱

上面提及了和知识图谱相关的一些早期概念。为了让读者能够更好地区分这些概念,以及更好地在整体上把握知识谱图发展过程,下面将对这些概念作一个更为详细的介绍。

▌一、语义网络(Semantic Network)

对于初学者来讲,这个概念很容易和语义网(Semantic Web)相混淆。为了行文一致,除非特别说明,语义网络指 Semantic Network,语义网指 Semantic Web。

语义网络是由 Quillian 于上世纪60年代提出的知识表达模式,其用相互连接的节点和边来表示知识。节点表示对象、概念,边表示节点之间的关系。

RDF

语义网络的优点:

容易理解和展示。

相关概念容易聚类。

语义网络的缺点:

节点和边的值没有标准,完全是由用户自己定义。

多源数据融合比较困难,因为没有标准。

无法区分概念节点和对象节点。

无法对节点和边的标签(label,我理解是schema层,后面会介绍)进行定义。

简而言之,语义网络可以比较容易地让我们理解语义和语义关系。其表达形式简单直白,符合自然。然而,由于缺少标准,其比较难应用于实践。看过上一篇文章的读者可能已经发现,RDF 的提出解决了语义网络的缺点1和缺点2,在节点和边的取值上做了约束,制定了统一标准,为多源数据的融合提供了便利。另外,RDF 对 is-a关系进行了定义,即,rdf:type(是rdf标准中的一个词汇,之后的文章会介绍)。因此,不管在哪个语义网络中,表达 is-a关系,我们都用 rdf:type,在语法上形成了统一。比如上图中猫、熊与哺乳动物的关系就可以形式化的表达为:

猫 rdf:type 哺乳动物 熊 rdf:type 哺乳动物

但还有个问题,如何区分概念和对象?即定义 Class 和 Object(也称作Instance, Entity)。如果不能区分,会对我们产生什么影响?举个例子,假如我们有两个语义网络A和B。在A中,熊是哺乳动物的一个实例。在B中,熊是哺乳动物的一个子类。前者是 is-a 关系,后者是 subClassOf 关系。这种情况常有发生,我们建模的角度不同,那么同一个事物的表示也可能不同。如果我们不能用一种方法来区别两者,不仅会给我们带来理解上的困难,在进行融合的时候也会造成数据冲突。我们不能说 A既是B的一个实例,又是 B的一个子类。W3C 制定的另外两个标准 RDFS/OWL解决了这个问题,如下图。

RDF

在语义网技术栈中,RDFS 和 OWL 是 RDF 更上一层的技术,主要是为了解决语义网络的缺点 3和缺点 4,其提供了 schema层的描述。在后续文章中,我们将更详细地介绍 RDF,RDFS/OWL。在这里,读者只需要知道,通过RDFS 或者 OWL 中的预定义词汇,我们可以形式化地声明一个类:

哺乳动物 rdf:type rdfs:Class

或者

哺乳动物 rdf:type owl:Class

通过 RDFS 也可以声明一个子类:

熊 rdf:type rdfs:Class熊 rdfs:subClassOf 哺乳动物

或者声明一个实例

熊 rdf:type 哺乳动物

我们也可以把rdf:type用a代替,即:

熊 a 哺乳动物

RDF,RDFS/OWL 属于语义网技术栈,它们的提出,使得语义网克服了语义网络的缺点。

尽管语义网络有这些缺点,还是有许多项目是基于语义网络的思想建立起来的。下面列几个比较出名和实用的项目:

WordNet。它是一个英语的词汇库,将英语单词划分为同义词集合,用不同的语义关系将这些集合关联起来。其在自然语言处理的中有许多应用,比如消歧、信息检索、文本分类、文本摘要等等。

BabelNet。相对于 WordNet,BabelNet 是一个多语言的词汇库。它是通过自动把维基百科链接到 WordNet 上构建起来的,另外也用到了其他的一些词汇资源。

HowNet,即知网,中文语义词典。其以汉语和英语词语所代表的概念为描述对象,构建了一个包含概念之间以及概念所具有的属性之间的关系的常识知识库。

▌二、语义网(Semantic Web)和链接数据(Linked Data)

语义网和链接数据是万维网之父 Tim Berners Lee 分别在1998年和2006提出的。相对于语义网络,语义网和链接数据倾向于描述万维网中资源、数据之间的关系。其实,本质上,语义网、链接数据还有 Web 3.0 都是同一个概念,只是在不同的时间节点和环境中,它们各自描述的角度不同。它们都是指 W3C 制定的用于描述和关联万维网数据的一系列技术标准,即,语义网技术栈。

语义网是一个更官方的名称,也是该领域学者使用得最多的一个术语,同时,也用于指代其相关的技术标准。在万维网诞生之初,网络上的内容只是人类可读,而计算机无法理解和处理。比如,我们浏览一个网页,我们能够轻松理解网页上面的内容,而计算机只知道这是一个网页。网页里面有图片,有链接,但是计算机并不知道图片是关于什么的,也不清楚链接指向的页面和当前页面有何关系。语义网正是为了使得网络上的数据变得机器可读而提出的一个通用框架。“Semantic”就是用更丰富的方式来表达数据背后的含义,让机器能够理解数据。“Web”则是希望这些数据相互链接,组成一个庞大的信息网络,正如互联网中相互链接的网页,只不过基本单位变为粒度更小的数据,如下图。

RDF

链接数据起初是用于定义如何利用语义网技术在网上发布数据,其强调在不同的数据集间创建链接。Tim Berners Lee 提出了发布数据的四个原则,并根据数据集的开放程度将其划分为1到5星5个层次。链接数据也被当做是语义网技术一个更简洁,简单的描述。当它指语义网技术时,它更强调“Web”,弱化了“Semantic”的部分。对应到语义网技术栈,它倾向于使用 RDF 和SPARQL(RDF查询语言)技术,对于 Schema 层的技术,RDFS 或者 OWL,则很少使用。链接数据应该是最接近知识图谱的一个概念,从某种角度说,知识图谱是对链接数据这个概念的进一步包装。开放链接数据项目进展的可视化,也通常用来展示当前开放知识图谱的规模,涉及的领域以及知识图谱间的链接关系。

RDF

▌三、知识图谱(Knowledge Graph)

上一篇文章中,我们用平实的语言给出了知识图谱的定义和组织形式。用更正式的说法,知识图谱是由本体(Ontology)作为 Schema 层,和 RDF 数据模型兼容的结构化数据集。本体本身是个哲学名词,AI 研究人员于上个世纪70年代引入计算机领域。Tom Gruber把本体定义为“概念和关系的形式化描述”,分别指实体的类层次和关系层次。我们以上篇文章罗纳尔多知识图为例,我们用 IRI 唯一标志的节点都是某个类的一个实例,每一条边都表示一个关系。罗纳尔多是一个人,里约热内卢是一个地点,我们用 RDF 来表示就是:

www.kg.com/person/1 rdf:type kg:Person. www.kg.com/place/10086 rdf:type kg:Place.

关系我们也称为属性(Property),根据是实体和实体之间的关系还是实体和数据值之间的关系分为对象属性(Object Property)和数据属性(Data Property)。在图中,罗纳尔多和里约热内卢的关系(本例中是对象属性)与罗纳尔多和全名的关系(本例中是数据属性)用 RDF 就可以表示为:

www.kg.com/person/1 kg:

hasBirthPlace www.kg.com/place/10086

www.kg.com/person/1 kg:

fullName "Ronaldo Luís Nazário de Lima"^^xsd:string

这里 kg:Person,kg:Place,kg:hasBirthPlace,kg:fullName是我们在 Ontology中定义好的类和关系。

RDF

链接数据和知识图谱最大的区别在于:

正如上面 Open Linked Data Project 所展示的,每一个圆圈代表一个独立存在和维护的知识图谱;链接数据更强调不同 RDF 数据集(知识图谱)的相互链接。

知识图谱不一定要链接到外部的知识图谱(和企业内部数据通常也不会公开一个道理),更强调有一个本体层来定义实体的类型和实体之间的关系。另外,知识图谱数据质量要求比较高且容易访问,能够提供面向终端用户的信息服务(查询、问答等等)。

▌四、总结

这部分介绍了和知识图谱相关的几个早期概念,以及他们之间的异同。在下面的内容当中,我们将会介绍语义网技术栈中比较基础和重要的技术标准:RDF,RDFS 和 OWL。另外,会结合实践,让读者学会用 protege 自顶向下地构建自己的本体结构。

知识图谱基础之RDF,RDFS与OWL

看到这里大家应该对 RDF 有了一个大致的认识和理解。接下来就是本次内容的最后一部分,将结合实例对 RDF 和 RDFS/OWL,这两种知识图谱基础技术作进一步的介绍。其实,RDF、RDFS/OWL 是类语义网概念背后通用的基本技术,而知识图谱是其中最广为人知的概念。

▌一、知识图谱的基石:RDF

RDF表现形式

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

RDF

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 数据。

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

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

RDFa, 即“The Resource Description Framework in Attributes”,是HTML5 的一个扩展,在不改变任何显示效果的情况下,让网站构建者能够在页面中标记实体,像人物、地点、时间、评论等等。也就是说,将 RDF 数据嵌入到网页中,搜索引擎能够更好的解析非结构化页面,获取一些有用的结构化信息。读者可以去感受一下 RDFa,其直观展示了普通用户看到的页面,浏览器看到的页面和搜索引擎解析出来的结构化信息。

JSON-LD,即“JSON for Linking Data”,用键值对的方式来存储 RDF 数据。

下面,我们结合上文中罗纳尔多知识图的例子,给出其 N-Triples 和 Turtle 的具体表示。

RDF

Example1 N-Triples:  "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.  "足球运动员"^^string.  "Ronaldo Luís Nazário de Lima"^^string.  "1976-09-18"^^date.  "180"^^int.  "98"^^int.  "巴西"^^string.  .  "里约热内卢"^^string.  "-22.908333, -43.196389"^^string.

用 Turtle 表示的时候我们会加上前缀(Prefix)对 RDF 的 IRI 进行缩写。

Example2 Turtle:@prefix person:  .@prefix place:  .@prefix :  .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:  .@prefix place:  .@prefix :  .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:  .@prefix rdf:  .@prefix :  .### 这里我们用词汇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. 用于定义类。

rdfs:domain. 用于表示该属性属于哪个类别。

rdfs:range. 用于描述该属性的取值类型。

rdfs:subClassOf. 用于描述该类的父类。比如,我们可以定义一个运动员类,声明该类是人的子类。

rdfs:subProperty. 用于描述该属性的父属性。比如,我们可以定义一个名称属性,声明中文名称和全名是名称的子类。

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

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

RDF

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 有两个主要的功能:

提供快速、灵活的数据建模能力。

高效的自动推理。

我们先谈如何利用 OWL 进行数据建模。用 OWL 对罗纳尔多知识图进行语义层的描述:

@prefix rdfs:  .@prefix rdf:  .@prefix :  .@prefix 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 后,层次图表示为:

RDF

数据属性用青色表示,对象属性由蓝色表示。

罗纳尔多这个例子不能展现 OWL 丰富的表达能力,我们这里简单介绍一下常用的词汇:

描述属性特征的词汇

owl:TransitiveProperty. 表示该属性具有传递性质。例如,我们定义“位于”是具有传递性的属性,若A位于B,B位于C,那么A肯定位于C。

owl:SymmetricProperty. 表示该属性具有对称性。例如,我们定义“认识”是具有对称性的属性,若A认识B,那么B肯定认识A。

owl:FunctionalProperty. 表示该属性取值的唯一性。 例如,我们定义“母亲”是具有唯一性的属性,若A的母亲是B,在其他地方我们得知A的母亲是C,那么B和C指的是同一个人。

owl:inverseOf. 定义某个属性的相反关系。例如,定义“父母”的相反关系是“子女”,若A是B的父母,那么B肯定是A的子女。

本体映射词汇(Ontology Mapping)

owl:equivalentClass. 表示某个类和另一个类是相同的。

owl:equivalentProperty. 表示某个属性和另一个属性是相同的。

owl:sameAs. 表示两个实体是同一个实体。

本体映射主要用在融合多个独立的 Ontology(Schema)。举个例子,张三自己构建了一个本体结构,其中定义了 Person 这样一个类来表示人;李四则在自己构建的本体中定义 Human 这个类来表示人。当我们融合这两个本体的时候,就可以用到 OWL 的本体映射词汇。回想我们在第二篇文章中提到的 Linked Open Data,如果没有 OWL,我们将无法融合这些知识图谱。

 rdf:type owl:Class . rdf:type owl:Class . owl:equivalentClass  .

更多的OWL词汇和特性请参考 

[W3C官网文档] (OWL Web Ontology Language Overview)

https://www.w3.org/TR/2004/REC-owl-features-20040210/

接下来我们谈一下 OWL 在推理方面的能力。知识图谱的推理主要分为两类:基于本体的推理和基于规则的推理。

我们这里谈的是基于本体的推理。读者应该发现,上面所介绍的属性特征词汇其实就创造了对 RDF 数据进行推理的前提。此时,我们加入支持 OWL 推理的推理机(reasoner),就能够执行基于本体的推理了。RDFS 同样支持推理,由于缺乏丰富的表达能力,推理能力也不强。举个例子,我们用 RDFS 定义人和动物两个类,另外,定义人是动物的一个子类。此时推理机能够推断出一个实体若是人,那么它也是动物。OWL 当然支持这种基本的推理,除此之外,凭借其强大的表达能力,我们能进行更有实际意义的推理。想象一个场景,我们有一个庞大数据库存储人物的亲属关系。里面很多关系都是单向的,比如,其只保存了A的父亲(母亲)是B,但B的子女字段里面没有A,如下表。

RDF

如果在只有单个关系,数据量不多的情况下,我们尚能人工的去补全这种关系。如果在关系种类上百,人物上亿的情况下,我们如何处理?当进行关系修改,添加,删除等操作的时候,该怎么处理?这种场景想想就会让人崩溃。如果我们用 inversOf 来表示 hasParent 和 hasChild 互为逆关系,上面的数据可以表示为:

RDF

绿色的关系表示是我们 RDF 数据中真实存在的,红色的关系是推理得到的。通过这个例子,相信读者应该初步了解了 OWL 的推理功能和能力。

目前,OWL 的最新版本是 OWL 2,在兼容 OWL 的基础上添加了新的功能,有兴趣的读者可以查阅 W3C文档。另外,OWL2 包含了三个标准,或者三种配置(Profile),它们是 OWL2 完整标准(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)的场合。

▌三、总结

本部分主要介绍了 RDF 的序列化方式,如何利用 RDFS/OWL 进行 schema层的建模,和 OWL 的推理功能。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分