人生倒计时
- 今日已经过去小时
- 这周已经过去天
- 本月已经过去天
- 今年已经过去个月
对知识图谱感兴趣的读者可以关注我的知乎专栏,主要介绍知识图谱的相关概念和技术,以及一些具体的实践。
看过前两篇文章(1、2)的读者应该对RDF有一个大致的了解和了解。本文将通过实例进一步介绍 RDF 和 RDFS/OWL 这两种基础知识图谱技术。实际上,RDF和RDFS/OWL是类语义网概念背后的常用基础技术,知识图谱是最广为人知的概念。
1.知识图谱的基石:RDF RDF表示
RDF(),资源描述框架,本质上是一个数据模型。它提供了描述实体/资源的统一标准。简单地说,它是一种表达事物的方法和手段。RDF正式表示为一个SPO三元组,有时也称为句子(),我们也称它为知识图谱中的一条知识,如下图所示。
RDF由节点和边组成,节点代表实体/资源、属性,边代表实体与实体之间的关系以及实体与属性之间的关系。在第一篇文章(为什么需要知识图谱?什么是知识图谱?——KG的前世今生)中,我们结合罗纳尔多的例子介绍了RDF节点和边的类型约束,这里不再赘述。不熟悉RDF的读者可以参考第一篇文章,有更直观的描述和解释。
RDF序列化方法
有了 RDF 的表示和类型,我们如何创建一个 RDF 数据集并序列化()它?换句话说,我们如何存储和传输 RDF 数据。目前RDF序列化的主要方法有:RDF/XML、N-、RDFa、JSON-LD等。
RDF/XML,顾名思义,就是用XML格式来表示RDF数据。提出这种方法是因为XML技术比较成熟,有很多现成的工具来存储和解析XML。但是对于RDF来说,XML格式过于冗长,不易阅读,通常我们不会用这种方式来处理RDF数据。
N-,即使用多个三元组来表示RDF数据集,是最直观的表示方法。文件中每一行代表一个三元组,便于机器解析处理。开放领域知识图通常以这种格式发布数据。
,应该是最常用的RDF序列化方式。它比 RDF/XML 更紧凑,比 N-更具可读性。
RDFa,或“The in”,是 HTML5 的扩展,它使网站建设者能够在页面上标记实体,例如谁、何地、何时、评论等,而无需更改任何显示效果。也就是说,通过将RDF数据嵌入到网页中,搜索引擎可以更好地解析非结构化页面,获取一些有用的结构化信息。读者可以到这个页面体验RDFa,它直观地展示了普通用户看到的页面、浏览器看到的页面以及搜索引擎解析的结构化信息。
JSON-LD,或“JSON for Data”,使用键值对来存储 RDF 数据。有兴趣的读者可以参考这个网站。
下面,我们结合第一篇文章中罗纳尔多的知识图谱的例子,给出其N-sum的具体表示。
Example1 N-Triples:
.kg.com/person/1> .kg.com/ontology/chineseName> "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
.kg.com/person/1> .kg.com/ontology/career> "足球运动员"^^string.
.kg.com/person/1> .kg.com/ontology/fullName> "Ronaldo Luís Nazário de Lima"^^string.
.kg.com/person/1> .kg.com/ontology/birthDate> "1976-09-18"^^date.
.kg.com/person/1> .kg.com/ontology/height> "180"^^int.
.kg.com/person/1> .kg.com/ontology/weight> "98"^^int.
.kg.com/person/1> .kg.com/ontology/nationality> "巴西"^^string.
.kg.com/person/1> .kg.com/ontology/hasBirthPlace> .kg.com/place/10086>.
.kg.com/place/10086> .kg.com/ontology/address> "里约热内卢"^^string.
.kg.com/place/10086> .kg.com/ontology/coordinate> "-22.908333, -43.196389"^^string.
使用时,我们会添加一个前缀()来缩写RDF的IRI。
Example2 Turtle:
@prefix person: .kg.com/person/> .
@prefix place: .kg.com/place/> .
@prefix : .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.
同一个实体有多个属性(数据属性)或关系(对象属性),我们可以只用一个来表示它,使其更紧凑。我们可以将上面的内容改为:
Example3 Turtle:
@prefix person: //www.kg.com/person/> .
@prefix place: //www.kg.com/place/> .
@prefix : //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.
即一个实体用一个句子表示(这里的句子指的是英文句点“.”)而不是多个句子,属性之间用分号隔开。
RDF的表现力
在第二篇文章( Web, Web, Data and Graph)中,我们提到RDF表达能力有限,不能区分类和对象,不能定义和描述类关系/属性。我的理解是,RDF 是对具体事物的描述,缺乏抽象来定义和描述同一类别的事物。以罗纳尔多的知识图谱为例,RDF可以表达罗纳尔多和里约热内卢有什么属性以及它们之间的关系。但是如果要定义C罗是一个人,里约热内卢是一个地方,一个人有什么属性,一个地方有什么属性,人和地方之间存在什么关系,那么RDF就无能为力了。无论是在智能概念上,还是在实际应用中,这种泛化和抽象能力非常重要;同时,知识图谱本身也非常强调这一点。RDFS和OWL这两种技术,或者说模式语言/本体语言(/),解决了RDF表达能力有限的困境。
2.RDF的“衣服”——RDFS/OWL
RDFS/OWL之所以成为RDF的“衣服”,是因为它们都是用来描述RDF数据的。为了不显得那么抽象,我们可以类比一下关系数据库中的概念。用过Mysql的读者应该都知道它也叫。这与我们在这里提到的非常相似。我们可以认为数据库中的每张表都是一个类(Class),而表中的每一行都是该类的一个实例或对象(学过java等面向对象编程语言的读者容易理解) . 表中的每一列都是该类中包含的一个属性。如果我们在数据库中表示这两类人和地点,那么分别为它们创建一个表;然后用另一个表来表示人和地点之间的关系。
: RDFS/OWL 序列化与 RDF 没有区别。事实上,就表示而言,它们是RDF。其常用的方法主要是RDF/XML。另外,通常我们用小写的词或短语来表示属性,用大写来表示类。数据属性(数据、实体与字面量之间的关系)通常由名词组成,而对象数据(、实体与实体之间的关系)通常由动词(has、is等)后接名词组成。其余的遵循驼峰式。为了使它们更清晰,避免读者混淆,我们以后将默认采用这种命名方式。读者实践没有强制性的命名约定,但最好保持一致。
轻量级模式语言 - RDFS
RDFS,或“”,是最基本的模式语言。以罗纳尔多的知识图为例,我们在概念和抽象层面定义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术语:
1.rdfs:类。用于定义类。
2.rdfs:。用于指示属性属于哪个类别。
3.rdfs:范围。用于描述该属性的值类型。
4.rdfs:。用于描述该类的父类。例如,我们可以定义一个运动员类并声明该类是 的子类。
5.rdfs:。用于描述该属性的父属性。比如我们可以定义一个name属性,声明中文名和全名是名字的子类。
实际上知识图谱 本体 实体,rdf: 和 rdf:type 也是 RDFS 词汇表,因为 RDFS 本质上是 RDF 词汇表的扩展。为了不让读者感到困惑,我们在这里不列出它们。有关其他 RDFS 术语及其用法,请参阅 W3C 官方文档。
为了让读者更直观的理解知识图谱中RDF和RDFS/OWL所代表的层,我们用下图来表示示例中的数据层和模式层。
Data层是我们用RDF对C罗的知识图谱的具体描述,是我们自己定义的一些词汇(类别、属性),RDF(S)是预定义的词汇。从下到上是一个从具体到抽象的过程。图中,我们用红色圆角矩形表示类,绿色字体表示三个预定义的词rdf:type、rdfs:、rdfs:range,虚线表示rdf:type的关系。另外,为了减少图中线条的相交,我们只保留了这个属性的rdf:type关系,省略了其他属性的关系。
RDFS 扩展 - OWL
我们在上面提到,RDFS 本质上是 RDF 词汇表的扩展。后来发现RDFS的表达能力还是比较有限的,于是提出了OWL。我们还可以将 OWL 视为 RDFS 的扩展,它添加了额外的预定义词汇表。
OWL,或“Web”,是语义网技术栈的核心之一。OWL有两个主要功能:
1. 提供快速灵活的数据建模能力。
2. 高效的自动推理。
先说一下如何使用OWL进行数据建模。用OWL来描述C罗知识图谱的语义层:
@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 .
层描述语言改为OWL后,层图表示为:
数据属性以青色表示,对象属性以蓝色表示。
罗纳尔多的例子并不能显示出猫头鹰丰富的表达能力。这里我们简单介绍一下常用的词汇:
描述属性的词汇
1. 猫头鹰:。表示该属性是可传递的。例如,我们将“at”定义为传递属性,如果 A 在 B 且 B 在 C 处,则 A 必须在 C 处。
2. 猫头鹰:。表示属性是对称的。例如,我们将“知识”定义为具有对称性的属性,如果 A 知道 B,则 B 必须知道 A。
3. 猫头鹰:。表示该属性值的唯一性。例如,我们将“母亲”定义为唯一属性,如果 A 的母亲是 B,而在其他地方我们知道 A 的母亲是 C,那么 B 和 C 指的是同一个人。
4. 猫头鹰:。定义属性的反向关系。例如,定义“父”的逆关系是“子”,如果A是B的父,那么B一定是A的子。
本体映射词汇 ( )
1. 猫头鹰:。表示一个类与另一个类相同。
2. 猫头鹰:。表示一个属性与另一个属性相同。
3. 猫头鹰:。表示两个实体是同一个实体。
本体映射主要用于融合多个独立的( )。例如,张三构建了一个本体结构,定义了这样一个类来表示人;李斯在他为代表人而构建的本体中定义了 Human 类。当我们融合这两个本体时,我们可以使用OWL的本体映射词汇。回想一下,我们在第二篇文章中提到了 Open Data,如果没有 OWL,我们将无法融合这些知识图谱。
rdf:type owl:Class 。
rdf:type owl:Class 。
猫头鹰: 。
更多OWL词汇和特性请参考W3C官网文档。
接下来说说OWL的推理能力。知识图谱的推理主要分为两类:基于本体的推理和基于规则的推理。
我们在这里谈论基于本体的推理。读者应该会发现,上面介绍的属性特征词汇实际上为RDF数据的推理创造了前提。此时,我们可以通过添加一个支持OWL推理的推理引擎()来进行基于本体的推理。RDFS 还支持推理。由于缺乏丰富的表达能力,推理能力不强。例如,我们使用 RDFS 来定义两个类,人类和动物,此外,将人类定义为动物的子类。此时推理引擎可以推断出,如果一个实体是人,那么它也是动物。OWL 当然支持这种基本推理,除此之外,凭借其强大的表达能力,我们可以进行更实际的推理。想象一个场景,我们有一个庞大的人们亲属关系数据库。其中的许多关系都是单向的。比如只保存了A的父亲(母亲)是B,但是B的子字段中没有A,如下表所示。
一个
乙
乙
如果只有一个关系,数据量很小,我们仍然可以手动完成这个关系。如果有数百种关系和数亿人,我们如何处理它们?修改、添加、删除等关系怎么办?想到这样的场景,我不由得瑟瑟发抖。如果我们用相互之间的反比关系来表示,上述数据可以表示为:
绿色的关系表示它确实存在于我们的RDF数据中,红色的关系是推断出来的。通过这个例子,相信读者应该对OWL的推理功能和能力有一个初步的了解。
目前OWL的最新版本是OWL 2,在兼容OWL的基础上增加了新的功能。有兴趣的读者可以参考 W3C 文档。此外,OWL 2 包含三个标准,或三个配置 (),它们是 OWL 2 完整标准 (OWL 2/Full) 的子集。读者目前不需要考虑它们之间的区别,只有当我们需要使用OWL自动推理功能时,才需要考虑使用哪种配置。而且在大多数情况下,我们需要知道哪种配置最合适。以下是使用它们的场景的简要说明:
OWL 2/EL 使用场景:本体结构中有大量相互关联的类和属性知识图谱 本体 实体,设计者希望使用自动推理引擎来获取其中的复杂关系。OWL 2/QL 用例:有很多实例数据。OWL 2 QL 本体可以重写为 SQL 查询,适用于使用 OBDA(基于数据)访问关系数据库。也就是说,我们不是将关系数据库中的数据显式转换为RDF,而是将数据库转换为虚拟RDF图,通过映射进行访问。OWL 2/RL 使用场景:需要结合基于规则的推理引擎的场合。三、总结
本文主要介绍RDF的序列化方法,如何使用RDFS/OWL进行层建模,以及OWL的推理功能。接下来,我们将介绍如何在现有的关系数据库的基础上,从上到下构建自己的本体结构。
参考博客:Learn : Learn owl and : RDFS 1.1W3C: OWL : OWL2 Data and in Large