RDF查询语言SPARQL
前面我们已经介绍过了语义网技术栈中的RDF,RDFS/OWL。这次我们介绍最后一个核心技术标准——SPARQL(RDF,OWL和SPARQL称为语义网的三大核心技术)。RDF本质上是一种数据模型,那么我们如何在RDF上进行查询呢?类似使用SQL查询关系数据库,我们使用SPARQL查询RDF格式的数据。本文先简单介绍一下SPARQL的历史,然后结合我们实践篇的数据举几个具体的例子。
一、SPARQL
SPARQL即SPARQL Protocol and RDF Query Language的递归缩写,专门用于访问和操作RDF数据,是语义网的核心技术之一。W3C的RDF数据存取小组(RDF Data Access Working Group, RDAWG)对其进行了标准化。在2008年,SPARQL 1.0成为W3C官方所推荐的标准。2013年发布了SPARQL 1.1。相对第一个版本,其支持RDF图的更新,提供更强大的查询,比如:子查询、聚合操作(像我们常用的count)等等。
从SPARQL的全称我们可以知道,其由两个部分组成:协议和查询语言。
- 查询语言很好理解,就像SQL用于查询关系数据库中的数据,XQuery用于查询XML数据,SPARQL用于查询RDF数据。
- 协议是指我们可以通过HTTP协议在客户端和SPARQL服务器(SPARQL endpoint)之间传输查询和结果,这也是和其他查询语言最大的区别。
一个SPARQL查询本质上是一个带有变量的RDF图,以我们之前提到的罗纳尔多RDF数据为例:
<http://www.kg.com/person/1> <http://www.kg.com/ontology/chineseName> "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.
- 1
我们把属性值用变量代替(SPARQL中,用问号加变量名的方式来表示一个变量。),即:
<http://www.kg.com/person/1> <http://www.kg.com/ontology/chineseName> ?x.
- 1
SPARQL查询是基于图匹配的思想。我们把上述的查询与RDF图进行匹配,找到符合该匹配模式的所有子图,最后得到变量的值。就上面这个例子而言,在RDF图中找到匹配的子图后,将”罗纳尔多·路易斯·纳萨里奥·德·利马”和“?x”绑定,我们就得到最后的结果。简而言之,SPARQL查询分为三个步骤:
- 构建查询图模式,表现形式就是带有变量的RDF。
- 匹配,匹配到符合指定图模式的子图。
- 绑定,将结果绑定到查询图模式对应的变量上。
二、例子
以实践篇的RDF电影数据为例,我们介绍如何利用SPARQL查询:
- 所有的RDF三元组。
- 周星驰出演了哪些电影?
- 英雄这部电影有哪些演员参演?
- 巩俐参演的评分大于7的电影有哪些?
如何查询所有数据?参照我们在第一个部分介绍的查询过程,查询所有数据即我们没有任何已知值,SPO三元组每个都是未知变量。对应的SPARQL查询语言为:
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX vocab: <http://localhost:2020/resource/vocab/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX map: <http://localhost:2020/resource/#>
PREFIX db: <http://localhost:2020/resource/>SELECT * WHERE {?s ?p ?o
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
SPARQL的部分关键词:
- SELECT, 指定我们要查询的变量。在这里我们查询所有的变量,用*代替。
- WHERE,指定我们要查询的图模式。含义上和SQL的WHERE没有区别。
- FROM,指定查询的RDF数据集。我们这里只有一个图,因此省去了FROM关键词。
- PREFIX,用于IRI的缩写。
下面是该语句的部分查询结果:
s p odb:genre/12 [http] :genreName "冒险"
db:genre/12 [http] rdf:type :Genre
db:genre/14 [http] :genreName "奇幻"
db:genre/14 [http] rdf:type :Genre
db:genre/16 [http] :genreName "动画"
db:genre/16 [http] rdf:type :Genre
db:genre/18 [http] :genreName "剧情"
db:genre/18 [http] rdf:type :Genre
db:genre/27 [http] :genreName "恐怖"
db:genre/27 [http] rdf:type :Genre
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
“周星驰出演了哪些电影”:
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX vocab: <http://localhost:2020/resource/vocab/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX map: <http://localhost:2020/resource/#>
PREFIX db: <http://localhost:2020/resource/>SELECT ?n WHERE {?s rdf:type :Person.?s :personName '周星驰'.?s :hasActedIn ?o.?o :movieTitle ?n
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
部分结果:
n"功夫"
"琉璃樽"
"英雄本色"
"少林足球"
"西游记第壹佰零壹回之月光宝盒"
"长江七号"
"西游记大结局之仙履奇缘"
"建国大业"
"审死官"
"龙在天涯"
"大内密探零零发"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
就我们这个例子而言,可以不要“?s rdf:type :Person”,这里只是让查询图更具体(在拥有复杂关系的RDF图中,可能会存在不同的类拥有相同的属性名。比如,猫和狗名字的属性名都是”name”,我们想查询一只叫汤姆的猫;如果不指定类型,返回结果可能也包含一只叫汤姆的狗)。图模式中,每个RDF用英文句号进行分割。
“英雄这部电影有哪些演员参演”:
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX vocab: <http://localhost:2020/resource/vocab/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX map: <http://localhost:2020/resource/#>
PREFIX db: <http://localhost:2020/resource/>SELECT ?n WHERE {?s rdf:type :Movie.?s :movieTitle '英雄'.?a :hasActedIn ?s.?a :personName ?n
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
结果:
n"李连杰"
"梁朝伟"
"张曼玉"
"章子怡"
"甄子丹"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
“巩俐参演的评分大于7的电影有哪些”:
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX vocab: <http://localhost:2020/resource/vocab/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX map: <http://localhost:2020/resource/#>
PREFIX db: <http://localhost:2020/resource/>SELECT ?n WHERE {?s rdf:type :Person.?s :personName '巩俐'.?s :hasActedIn ?o.?o :movieTitle ?n.?o :movieRating ?r.
FILTER (?r >= 7)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
结果:
n"2046"
"Memoirs of a Geisha"
"荆轲刺秦王"
"大红灯笼高高挂"
"霸王别姬"
"活着"
"唐伯虎点秋香"
"秋菊打官司"
"菊豆"
"Hong gao liang"
"画魂"
"风月"
"Piao Liang Ma Ma"
"The Hand"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
这里我们用到了FILTER关键词,可以对变量取值进行约束。
SPARQL更详细的语法和功能这里就不再多做介绍。读者可以参考W3C的文档或者SPARQL查询的例子,也有专门的书来讲解SPARQL 1.1(Learning SPARQL: Querying and Updating with SPARQL 1.1)
另外多提一点,关于知识图谱,有一个非常重要的概念,即开放世界假定(Open-world assumption,OWA)。这个假定的意思是当前没有陈述的事情是未知的,或者说知识图谱没有包含的信息是未知的。怎么理解?首先我们要承认知识图谱无法包含所有完整的信息。以我们这个电影数据的例子而言,很明显,它的数据十分残缺。即使我们拥有一个十分完整的电影知识图谱,包含了当下所有的电影、演员等信息,在现实世界中,信息也是动态变化和增长的。即,我们要承认知识图谱的信息本身就是残缺的。有了这个前提,我们来思考例子中的第二个SPARQL语句:
周星驰出演了上述查询结果中的电影。基于我们构建的电影知识图谱,提问:周星驰出演了《卧虎藏龙》吗?根据OWA,我们得到的答案是“不知道”,相反,如果是封闭世界假定(Closed-world assumption),我们得到的答案是“没有出演”。
我们在设计本体和开发相关应用的时候需要考虑开放世界假定。举个简单的例子,基于知识图谱的问答系统,用户提问“周星驰出演了《卧虎藏龙》吗?”,合适的回答是“不知道”而不是“没有出演”。直觉上这和一个人向另一个人提这个问题一样,如果我们知道问题答案,我们会给出肯定的回答,不知道的话,我们往往倾向于回复“我不知道”,“我不太清楚”,“我查查看”,而不是信誓旦旦地回答“没有出演”。毕竟,大多数人都有“自知之明”,知道自己总有不了解的东西。从这个角度上说,人和知识图谱类似,我们都存在于OWA的世界中。
三、总结
本文主要介绍了SPARQL及其基本用法,希望能让读者对SPARQL有个初步的认识。下一篇文章是实践篇,介绍如何利用D2RQ创建SPARQL endpoint并在我们的数据上进行相关查询。
参考资料
- Learn SPARQL
- SPARQL By Example
- SPARQL Query Language for RDF
- OWA
id="tmp_downloadhelper_iframe">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css"></div>
RDF查询语言SPARQL相关推荐
- 实践篇(3)RDF查询语言SPARQL
本文转载自SimmerChan大神知乎文章:https://zhuanlan.zhihu.com/p/32703794 文章目录 简介 1. SPARQL 2.例子 3开放域假设 4.总结 简介 前面 ...
- RDF和SPARQL
一.RDF(资源描述框架,Resource Description Framework) 资源描述框架(RDF)是万维网联盟规格(World Wide Web Consortium)家族的一员,一开始 ...
- RDF 和 SPARQL 初探:以维基数据为例
维基百科有一个姐妹项目,叫做"维基数据"(Wikidata).你可以从维基百科左侧边栏点进去. "维基数据"将维基百科的所有数据,整理成一个可以机器处理的数据库 ...
- linux+cp+-rdf,简单构建基于RDF和SPARQL的KBQA(知识图谱问答系统)
本文主要通过python实例讲解基于RDF和SPARQL的KBQA系统的构建.该项目可在python2和python3上运行通过. 注:KBQA即是我们通常所说的基于知识图谱的问答系统.这里简单构建的 ...
- Turtle RDF 和 SPARQL
Turtle 与 RDF/XML的对比: <?xml version="1.0" encoding="utf-16"?> <!DOCTYPE ...
- 使用 SPARQL 查询 RDF 数据
在 "大规模数据集成:使用 RDF 创建数据网络" 中,您了解了资源描述框架:一种万维网联盟 (W3C) 标准,它定义了一种基于图形的模型来支持来自几乎无限多个来源的完全可移植.灵 ...
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
- 快速搭建一个基于知识图谱的智能问答系统
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者:张墨一 知乎链接:https://zhuanlan.zhihu.com/p/582486 ...
- 【知识图谱】知识图谱概论
文章目录 一.知识图谱与语义技术概述 1.知识图谱的概念演化 2.重点 3.应用 4.KG的本质 二.典型知识图谱 三.知识图谱技术概览 1.KG技术体系 2.知识表示 (1)概述 (2)语义网知识表 ...
最新文章
- R语言构建logistic回归模型并评估模型:计算混淆矩阵、并基于混淆矩阵计算Accuray、Precision、Recall(sensitivity)、F1、Specificity指标
- Node.js 和Socket.IO 实现chat
- 参加web前端学习前需要知道的注意事项
- 双线性内插怎么缩小_汗蒸桶怎么选择才是最好的
- 执行容器内的shell_你的Docker容器可能充满了Graboid加密蠕虫
- 《恋上数据结构第1季》动态数组实现栈
- 美封锁对华半导体出口:14nm制造可以 X86设计不行
- 掌握3分钟网络排障秘技,网络管理员不再做“苦命人”
- 13个不错的jquery图片放大器效果
- **IEEE论文的检索下载及引用格式**
- linux主机如何安装杀毒软件,Linux 杀毒软件ClamAV安装部署
- 不同Costa环鉴相器鉴别特性
- Oracle | Oracle初级全程学习笔记
- 有一种冲动:世界那么大
- 【实战技能】软件工程师与AI工程师的区别是什么?
- 原来将Excel表格转换成应用程序如此简单
- 图欧学习资源库 https://tuostudy.com/
- deepnode软件下载地址_Flash cs6软件下载地址及安装教程
- kmalloc使用不当导致内存分配失败问题
- linux卸载先驱的命令是,【单选题】在Linux中,若要在同一行书写多条命令,命令之间应使用符号()分隔A. 转义字符\\ B. 分号; C. , D. 空格...