知识图谱基础(知乎系列博文)
本文从一个例子出发娓娓道来阐述了知识图谱的来源、结构,值得一学,参考链接:
https://zhuanlan.zhihu.com/p/31726910
https://zhuanlan.zhihu.com/p/31864048
https://zhuanlan.zhihu.com/p/32122644
什么是知识图谱
知识图谱(Knowledge Graph)是一个将现实世界映射到数据世界,是由节点和边组成的语义网络,其中节点代表物理世界中的实体或概念,边表示实体与实体的属性或它们之间的属性。
知识图谱的应用举例
以知识图谱在搜索引擎中的一个应用例子为例:
之所以举这样一个例子,是因为,计算机一直面临着这样的困境——无法获取网络文本的语义信息。
尽管近些年人工智能得到了长足的发展,在某些任务上取得超越人类的成绩,但离一台机器拥有一个两三岁小孩的智力这样一个目标还有一段距离。这距离的背后很大一部分原因是机器缺少知识。
如同上面的例子,机器看到文本的反应和我们看到罗纳尔多葡萄牙语原名的反应别无二致。为了让机器能够理解文本背后的含义,我们需要对可描述的事物(实体)进行建模,填充它的属性,拓展它和其他事物的联系,即,构建机器的先验知识。就以罗纳尔多这个例子说明,当我们围绕这个实体进行相应的扩展,我们就可以得到右上角的知识图。
构建知识图谱的优点
通过构建知识图谱,计算机能够找到大量复杂知识中潜在的关联,而人类由于脑容量有限,很难实现这一点。
知识图谱的结构
SPO
知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Object)。
RDF
在知识图谱中,我们可以用RDF表示这种三元关系。RDF形式上表示为SPO三元组,有时候也称为一条语句(statement),知识图谱中我们也称其为一条知识
RDF(Resource Description Framework,资源描述框架)是描述实体/关系的标准数据模型。RDF中共有三种类型:International Resource Identifiers(IRIs),blank nodes 和 literals。
- IRI类似知识图谱中的URL(统一资源标识符),在整个知识图谱中唯一定义了一个实体/资源。
- blank node简单来说就是没有IRI和literal的资源,类似空节点,或者说匿名资源。
- literal,字面量可以把看做是带有数据类型的纯文本,比如我们在第一个部分中提到的罗纳尔多原名可以表示为
"Ronaldo Luís Nazário de Lima"^^xsd:string
。
RDF中SPO每个部分的类型约束:
- Subject可以是IRI或blank node。
- Predicate是IRI。
- Object三种类型都可以。
RDF实例
那么上面的例子中的三元组用RDF形式来表示就是:
-
www.kg.com/person/1
是一个IRI,用来唯一的表示“罗纳尔多”这个实体。 -
kg:chineseName
也是一个IRI,用来表示中文名
这样一个属性。 -
kg:
是RDF文件中所定义的前缀,即@prefix kg: <http://www.kg.com/ontology/>
,kg:chineseName
其实就是http://www.kg.com/ontology/chineseName
的缩写。
将上面的知识图用更正式的形式画出来:
其实可以认为知识图谱就包含资源和字面量两种节点类型。字面量类似树结构中的叶子节点,出度为0,只能被指向。
知识图谱与语义网络的关系
语义网络(Semantic Web)用相互连接的节点和边来表示知识。节点表示对象、概念,边表示节点之间的关系。可以比较容易地让我们理解语义和语义关系。其表达形式简单直白,符合自然。然而,由于缺少标准,其比较难应用于实践。
知识图谱来源于语义网络,解决了语义网络缺乏标准的缺点
⭐️本体(Ontology)
用更正式的说法,知识图谱是由本体(Ontology)作为Schema层,和RDF数据模型兼容的结构化数据集。
Tom Gruber把本体定义为概念和关系的形式化描述,分别指实体的类层次和关系层次。我们以继续举上面篇的例子,用IRI唯一标志的节点都是某个类的一个实例,每一条边都表示一个关系。罗纳尔多是一个人,里约热内卢是一个地点,我们用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序列化方法
RDF可以说是知识图谱的基石,正是由RDF表示的一条条SPO三元组组成了整个知识图谱。
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的具体表示:
# 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就表示无能为力了。
但这种泛化抽象能力事实上相当重要,RDFS和OWL这两种技术,或者说模式语言/本体语言(schema/ontology language)解决了RDF表达能力有限的缺点。
RDFS/OWL
RDFS/OWL都是用来描述RDF数据的模式语言,RDFS/OWL本质上是一些预定义词汇(vocabulary)构成的集合,用于对RDF进行类似的类定义及其属性的定义。
模式语言与关系数据库的区别
关系数据库的database也被称为schema(模式),这个schema类似RDF的schema language,我们可以认为数据库中的每一张表都是一个类(Class),表中的每一行都是该类的一个实例或者对象,表中的每一列就是这个类所包含的属性。
例如如果我们是在数据库中来表示人和地点这两个类别,那么为他们分别建一张表就行了;再用另外一张表来表示人和地点之间的关系。
RDFS/OWL与RDF序列化方法
RDFS/OWL序列化方式和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](https://www.wolai.com/n5WCiaoc8bTHey7nWVeMuR#2e27EtKcXVzcex2D3GMRQs).
:Place rdf:type rdfs:Class.
### rdfs当中不区分数据属性和对象属性,词汇rdf:Property定义了属性,即RDF的“边”。
:chineseName rdf:type rdf:Property;
[rdfs:domain](https://www.wolai.com/n5WCiaoc8bTHey7nWVeMuR#4C5Bw9d2nsD9QCpxsK8DWk) :Person;
[rdfs:range](https://www.wolai.com/n5WCiaoc8bTHey7nWVeMuR#uMGQQqjW3VaZiaC4hbn2aK) 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:Class
用于定义类。 -
rdfs:domain
用于表示该属性属于哪个类别。 -
rdfs:range
用于描述该属性的取值类型。 -
rdfs:subClassOf
用于描述该类的父类。
比如,我们可以定义一个运动员类,声明该类是人的子类。 -
rdfs:subProperty
用于描述该属性的父属性。
比如,我们可以定义一个名称属性,声明中文名称和全名是名称的子类。
rdf:Property
和rdf:type
也是RDFS的词汇,因为RDFS本质上就是RDF词汇的一个扩展,RDFS其他的词汇及其用法请参考W3C官方文档。
RDFS在知识图谱中的层次
下方的数据层是我们用RDF对罗纳尔多知识图的具体描述,Vocabulary可以理解为模式层(schema,本体),是我们自己定义的一些词汇(类别,属性),RDF(S)则是预定义词汇。从下到上是一个具体到抽象的过程。
图中我们用红色圆角矩形表示类,绿色字体表示rdf:type
,rdfs:domain
,rdfs:range
三种预定义词汇,虚线表示rdf:type
这种所属关系。另外,为了减少图中连线的交叉,我们只保留了career这一个属性的rdf:type
所属关系,省略了其他属性的此关系。
OWL:RDFS的扩展
RDFS的表达能力还是相当有限,因此提出了OWL(Ontology Web Language,本体网络语言),也可以把OWL当做是RDFS的一个扩展,其添加了额外的预定义词汇。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 .
OWL在知识图谱中的层次
schema层的描述语言换为OWL后,层次图表示为:
数据属性用青色表示,对象属性由蓝色表示。