第八章 知识图谱和检索
知识图谱是一种 有向图结构,描述了现实世界中存在的实体、事件或者概念以及它们之间的关系。其中图的节点表示实体、事件或者概念,图的边表示相邻节点间的关系
知识图谱的存储
知识图谱中的知识是通过RDF结构进行表示的,其基本构成单元是事实。每个事实是一个三元组 (S,P,O) ,其中S是主语,其取值可以是实体、事件或者概念中的任何一个;P是谓语,其取值可以是关系或者属性;O是宾语,其取值可以是实体、事件、概念或者普通的值(e.g:数字、字符串等)
按存储策略的不同,可分为 基于表结构的存储 和 基于图结构的存储
基于表结构的存储
三元组表
优点:简单直接,易于理解
缺点:
- 整个知识图谱都存储在一张表中,导致单表的规模太大 ⇒ \Rightarrow ⇒ 实用性太差
- 复杂查询在这种存储结构上开销巨大
类型表
为每种类型构建一张表,同一类型的实例存放在相同的表中,虽然可以克服了三元组表的不足,但有新的问题:① 大量数据字段的冗余存储 ; ② 大量的数据列为空值(这是由于并非每个实体在所有属性或关系上都有值)
解决办法: 在构建数据表时,将知识图谱的类别体系考虑进来,即 每个类型的数据表只记录属于该类型的特有属性,不同类别的公共属性保存上一级类型对应的数据表中,下级表继承上级表的所有属性
不足:
- 由于类型表的不同字段表示了不同的属性或者关系,导致在查询时必须指明属性或关系,无法做不确定属性或关系的查询
- 由于数据表示和具体类型对应的,不同类型的数据表具有不同的结构,因此在查询之前必须知道目标对象的类型才能确定查找的数据表
- 当查询涉及不同类型的实体时,需要进行多表的链接,这一操作开销巨大,限制了知识图谱对复杂查询的处理能力
- 知识图谱通常包含丰富的实体类型,因此需要创建大量的数据表,并且这些数据表之间又具有复杂的关系 ⇒ \Rightarrow ⇒ 为数据的管理加大了难度
关系数据库
关系数据库以二维表对数据进行组织和存储,表的每一列表示一个属性,每一行表示一条记录。
每张表可以由任意数量的属性组成,这些属性按照各自的特点可以分为以下几类:
- 候选键
- 主键
- 外键
- 主属性和非主属性
常见的关系数据库:
- DB2
- Oracle
- Microsoft SQL Server
- PostgreSQL
- MySQL
基于图结构的存储
能够准确地反映知识图谱的内部结构,有利于对知识的查询
基于图结构的存储模型
节点表示实体,边表示实体之间的关系,其中节点可以定义属性,用于描述实体的特征,也可以为边定义属性
常用的图数据库:
- Neo4j
- OrientDB
- InfoGrid
- HyperGraphDB
- InfiniteGraph
知识图谱的检索
SQL语言
常用的共有四个操作:插入、修改、删除、查询
数据插入
指向数据表中添加新的数据记录,SQL通过INSERT语句完成该功能
基本语法:
(1)
INSERT INTO 表名 VALUES (值1,值2,……) [,(值1,值2,……),……]
(2)指明插入数据的列
INSERT INTO 表名(列1,列2,……) VALUES (值1,值2,……) [,(值1,值2,……),……]
数据修改
指对三元组做数据修改,SQL通过UPDATE语句完成该功能
基本语法:
UPDATE 表名 SET 列1 = 值1,列2 = 值2,…… WHERE 条件
“条件” 用于指明需要修改的数据记录,若不指定,则会导致整个表的数据都被修改
数据删除
删除一个实体,会删除与之相连的所有边。SQL通过DELETE语句完成该功能
基本语法:
DELETE FROM 表名 WHERE 条件
“条件” 用于指明需要删除的数据记录,若不指定,则会清空整张表
数据查询
SQL通过SELECT语句完成该功能,查询的结果存储在一个结果表中
基本语法:
SELECT 列1,列2,…… FROM 表名 WHERE 条件
若要查询指定数据表所有列的数据,则:
SELECT * FROM 表名 WHERE 条件
SPAROL语言
数据插入
指将新的三元组插入到已有的RDF图中,SPARQL用 INSERT DATA语句完成该功能
基本语法:
INSERT DATA 三元组数据
三元组数据可以是多条三元组,不同的三元组通过‘.’分隔,用‘;’可以连续插入与前一个三元组的头实体相同的三元组。如果待插入的三元组在RDF图中已经存在,则系统会忽略该三元组。
例:插入如下的三元组:
ns:费米 ns:老师 ns:玻恩
ns:玻恩 ns:类型 ns:数学家
ns:玻恩 ns:类型 ns:物理学家
对应的SPARQL语言
INSERT DATA {
ns:费米 ns:老师 ns:玻恩.
ns:玻恩 ns:类型 ns:数学家;
ns:类型 ns:物理学家.
}
数据删除
指从RDF图中删除一些三元组。SPARQL通过DELETE DATA语句完成该功能
基本语法:
DELETE DATA 三元组数据
其中三元组数据可以是多个三元组。对于给定的每个三元组,如果其在RDF图中,则将其从图中删除,则将其从图中删除,否则忽略该三元组。
例:删除三元组
(ns:奥本海默 ns:类型 ns:物理学家)
对应的SPARQL语句为:
DELETE DATA{
ns:奥本海默 ns:类型 ns:物理学家.
}
若删除“奥本海默”对应的节点,则对应的SPARQL语句为:
DELETE WHERE {
ns:奥本海默 ?p ?o .
?s ?p ns:奥本海默
}
数据更新
指更新RDF图中指定三元组的值,但SPARQL没有定义UPDATE操作,即SPARQL语言没有直接更新已有数据的方法,可以通过组合 INSERT DATA 和 DELETE DATA 语句完成该功能
数据查询
SPARQL提供了四种形式的数据查询功能:SELECT、ASK、DESCRIBE、CONSTRUCT
(1)SELECT:功能与SQL中的SELECT语句类似,从知识图谱中获取满足条件的数据
(2)ASK:用于测试知识图谱中是否存在满足给定条件的数据,如果存在则返回‘yes’,反之返回‘no’,该查询不会返回具体的匹配数据
(3)DESCRIBE:用于查询和指定资源相关的RDF数据,这些数据形成了对给定资源的详细描述
(4)CONSTRUCT:根据查询图的结果生成RDF
基本语法为:
(1)SELECT
SELECT 变量1 变量2 ... WHERE 图模式 [修饰符]
例:查询即是 数学家 也是 物理学家 的节点
对应的SPARQL语言是:
SELECT ?s
WHERE {
?s ns:类型 ns:数学家 .
?s ns:类型 ns:物理学家 .
}
(2)ASK
ASK 图模式
例:测试知识图谱中是否存在“费米”老师的节点
对应的SPARQL语句是:
ASK { ns:费米 ns:老师 ?o .}
(3)DESCRIBE
DESCRIBE 资源或变量 [WHERE 图模式]
例:获取老师为“玻恩”的节点的所有信息
对应的SPARQL语言:
DESCRIBE ?s WHERE { ?s ns:老师 ns:玻恩 .}
(4)CONSTRUCT
CONSTRUCT 图模板 WHERE 图模式
流程是:首先执行WHERE子句,从知识图谱中获取所有满足图模式的变量取值;然后针对每个变量取值,替换RDF图模板中的,生成一组三元组
CONSTRUCT{
?s ns:搭档 ns:奥本海默 .
ns:奥本海默 ns:搭档 ?s .
}
WHERE{
?s ns:老师 ns:玻恩 .
}
图检索技术
如何提高图查询的效率是知识图谱研究的重要问题
图查询的任务是在给定的图数据集中查找给定的查询图,其核心问题是判断查询图是否是图数据集的子图
子图筛选
图索引技术是实现子图筛选的有效方法
其基本原理是首先根据图上的特征信息建立索引,在进行子图匹配时,根据查询图上的特征能够快速地从图数据库中检索得到满足条件的候选子图,避免在全部子图上进行匹配操作
常用的两种图索引方法:基于路径的索引 和 基于子图的索引
基于路径的索引
将知识图谱中所有长度小于某特定值的路径收集起来,并根据这些路径为图数据库中的子图建立倒排索引。
首先从匹配图中抽取具有代表性的路径,然后利用索引检索获得所有包含这些路径的候选子图,最后在候选子图上进行同构测试获得最终的结果
优点:图的路径获取简单直接 ⇒ \Rightarrow ⇒ 构建索引比较方便
缺点:
- 耗费巨大的存储空间:随着路径长度的增加,路径数目呈指数级增长
- 不同路径对于子图的区分性差异很大,区分性低的路径对于降低搜索空间的效果有限
基于子图的索引
将子图作为索引的特征,关键问题是如何保证区分性的条件下减少索引的规模
常用的方法为:在构建索引时,通过在知识图谱上挖掘出的频繁子图作为建立索引的依据
频繁度:子图出现的频率
频繁度若设置过高,则每个索引项都指向过多的子图,导致过滤效果不佳;若设置过低,则导致索引项太多,不仅导致索引的空间开销过大,也影响索引的检索效率。
子图同构判定
Ullmann算法