7.2 结构化的查询语言

优质
小牛编辑
123浏览
2023-12-01

语义搜索的核心在于查询的构建和理解,本小节主要介绍面向知识图谱的标准结构化查询语言。回顾前面章节中的内容,知识图谱的数据模型为 RDF,它是 W3C 推荐的用于表示语义信息的重要数据标准。RDF 的核心思想是通过 RDF 三元组的形式描述事实知识。多个RDF三元组组成的集合构成了RDF数据集。目前,RDF已经成为知识图谱的主要描述格式,越来越多的知识图谱数据以 RDF 三元组的形式发布出来。多个知识图谱通过RDF三元组之间相互关联,形成了一个巨大的数据关联网络。以LOD为例,整个项目已经包含超过1000多亿条RDF三元组并依然在快速增加,蕴含了丰富的信息资源。精确查询并获取知识图谱中三元组中的有关信息是语义搜索的核心。

SPARQL查询语言是面向RDF图的结构化查询语言,目前已被W3C推荐为RDF数据的标准查询语言 [2] ,其地位和查询形式都类似于关系数据库的 SQL 语言。W3C 推荐RDF 数据集的发布者在发布数据的同时,能够提供相应的 SPARQL 检索引擎和查询接口。以 Apache 软件基金会的 Jena [3] 项目为代表的一些 SPARQL 开源框架,进一步促进了组织机构和个人快速方便地搭建自己的SPARQL查询服务。

SPARQL 查询的核心处理单元是类似 RDF 三元组形式的三元组模式(Triple Pattern),不同之处在于 SPARQL 的三元组模式中,主语、谓语或宾语可以是变量(以“?”开头标识)。例如,三元组模式<?film, director, Tim burton>可以用来查询“蒂姆·伯顿执导的电影有哪些?”同样,类似于 RDF 三元组可以组成 RDF 图的道理,由多个SPARQL 三元组模式组成的集合称作基本图模式(Basic Graph Pattern,BGP),基本图模式可以用来表示更为明确、复杂的查询需求。例如,基本图模式{<?film, director, Tim burton>,<?film, released, ?date>}可以用来查询“蒂姆·伯顿执导的电影和每部电影具体的上映时间”。除此之外,SPARQL 查询还定义了多个基本图模式之间进行的运算操作,以及基本图模式与 RDF 图匹配完成后的结果过滤操作(Filter Operator),如可以用?date大于1990(?date > 1990)对前面一个查询例子中的电影日期进行限制。最后,在SPARQL1.1版本中,还增加了联合查询功能,即支持通过 FROM 和嵌套查询的方式,进行多个数据源联合查询。据不完全统计 [4] ,目前互联网上1.49×1011 条三元组数据可以通过总计557个SPARQL查询终端查询获取,占全部三元组的99.87%[7]

为了便于读者更好地理解 SPARQL 查询、三元组模式、SPARQL 基本图模式以及约束条件,图7-2展示了一个有关电影信息的知识图谱和SPARQL样例。

图7-2 有关电影信息的知识图谱和SPARQL样例

SPARQL查询包括查询、插入和删除操作。下面将以图7-2中的样例知识图谱和对应的SPARQL查询实例,分别介绍如何使用SPARQL对知识图谱进行数据查询、数据插入以及数据删除操作。注意,图中的f1342、f1336、f1333以及p2556用来代指电影节点的IRIs。

7.2.1 数据查询

SPARQL 官方标准定义了四种最终返回给用户查询结果的形式,代表着四种基本的查询功能,即SELECT、ASK、CONSTRUCT和DESCRIBE。其中,SELECT是唯一可以返回知识图谱中图模式匹配具体结果给用户的形式,也是最常用的查询语句;ASK 查询语句主要用于测试知识图谱中是否存在满足给定查询约束条件的数据,结果以 Yes 或 No 的形式返回,除此之外没有额外的信息返回;CONSTRUCT 查询语句主要用于将图模式匹配结果生成新的 RDF 图;DESCRIBE 查询语句用于查询与指定 IRI 相关的数据,注意和SELECT有区别。下面结合实例分别对四种查询形式进行介绍。

1.SELECT的基本语法

其中,“SELECT”指明了查询的形式。“SELECT”后面的“变量1 变量2…”表示图匹配后想要查询的具体目标。“FROM”指明了数据源,在通常情况下,在单个知识图谱中查询时,默认不指明数据集的名称,即可以省略 SPARQL 查询中的 FROM 字段(后续其他形式的查询语句介绍中将不再提及 FROM 部分)。“WHERE”语句后面的大括号中就是具体的基本图模式和约束条件(FILTER字段给出)。值得注意的是,“WHERE”语句后面至少应该包含一个基本图模式(在查询语法中,不同的三元组模式在大括号中用英文句点“.”间隔),而约束条件为可选项。最后的修饰符 [5] (Modifier)同样是可选项,主要用于对查询的结果进行一些处理,常见的有排序操作 ORDER、限制结果数量操作 LIMIT等。图7-2中的 SPARQL 查询就是一个典型的 SELECT 查询,用来获取“蒂姆·伯顿1990年之后执导的电影名称和每部电影具体的上映时间”。典型的 SELECT 查询如图7-3所示。

图7-3 典型的SELECT查询

2.ASK的基本语法

其中,“ASK”指明了查询的形式。“ASK”后面的内容和 SELECT 中的“WHERE”部分类似。例如,如果想要查询图7-2中的知识图谱是否存在“Tim Burton”这个人,那么对应的SPARQL查询语句为

上述查询的结果将为“Yes”;假如图7-2中没有“Tim Burton”节点,结果将为“No”。

3.CONSTRUCT的基本语法

其中,“CONSTRUCT”指明了查询的形式。“CONSTRUCT”后面的“图模板”类似于基本图模式,指明了生成的RDF应该具有的基本三元组内容。而“WHERE”语句后面的基本图模式和 SELECT 语句中的类似,用于图模式匹配和约束。CONSTRUCT 查询的基本流程为:首先执行“WHERE”语句进行图模式匹配,从知识图谱中抽取满足条件的目标变量;随后,针对每一个目标变量,替换图模板中的对应变量,生成最终的 RDF图。例如,在图7-2中的知识图谱上运行如下CONSTRUCT查询语句:

将得到如下新的RDF图:

4.DESCRIBE的基本语法

其中,“DESCRIBE”指明了查询的形式。在“DESCRIBE”后面可以直接指明资源标识符,也可以用变量标识。“WHERE”语句后面的基本图模式和 SELECT 语句中的类似,用于图模式匹配和约束,不同之处在于 DESCRIBE 中的 WHERE 部分是可选项。例如,想要在图7-2的知识图谱中获取所有和“Tim Burton”相关的信息,可以运行如下的DESCRIBE查询语句:

对应的结果为:

7.2.2 数据插入

SPARQL支持通过INSERT DATA语句,将新的RDF三元组插入已有的RDF图中。具体的基本语法为:

其中,INSERT DATA 指明了查询的形式。在 INSERT DATA 后面可以是单条三元组,也可以是多条三元组构成的RDF图。在查询语法中,英文分号“;”可以用来连续插入头实体相同的三元组。如果 RDF 图中已经存在某条将要插入的三元组,那么该条三元组将被忽略。例如,可以将如下的三元组插入图7-2的知识图谱中。

对应的查询语句为:

7.2.3 数据删除

SPARQL的删除语句支持通过DELETE DATA语句将RDF图中已有的某些三元组删除。具体的基本语法为:

其中,DELETE DATA指明了查询的形式。与插入语句类似,在DELETE DATA后可以是单条三元组,也可以是多条三元组构成的RDF图。如果RDF图中已经存在将要删除的三元组或RDF图,那么该条三元组或RDF图在语句执行后将被删除。例如,可以将如下的三元组从图7-3所示的知识图谱中删除:

对应的查询语句为:

以上主要介绍了 SPARQL 的查询、插入以及删除方法,这是最基本的三种查询形式。SPARQL 虽然没有支持更新操作的语法,不过可以通过 DELETE DATA 和 INSERT DATA 结合使用来实现。此外,在 SPARQL1.1版本中增加了联合查询、简单蕴涵推理等内容,感兴趣的读者可以查阅相关标准规范。