新瓶装旧酒:RDF查询语言SPARQL

2020 年 7 月 21 日 AINLP

前面我们已经介绍过了语义网技术栈中的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的全称我们可以知道,其由两个部分组成:协议和查询语言。


1. 查询语言很好理解,就像SQL用于查询关系数据库中的数据,XQuery用于查询XML数据,SPARQL用于查询RDF数据。

2. 协议是指我们可以通过HTTP协议在客户端和SPARQL服务器(SPARQL endpoint)之间传输查询和结果,这也是和其他查询语言最大的区别。


一个SPARQL查询本质上是一个带有变量的RDF图,以我们之前提到的罗纳尔多RDF数据为例:


<http://www.kg.com/person/1> <http://www.kg.com/ontology/chineseName> "罗纳尔多·路易斯·纳萨里奥·德·利马"^^string.


我们把属性值用变量代替(SPARQL中,用问号加变量名的方式来表示一个变量。),即:


<http://www.kg.com/person/1> <http://www.kg.com/ontology/chineseName> ?x.


SPARQL查询是基于图匹配的思想。我们把上述的查询与RDF图进行匹配,找到符合该匹配模式的所有子图,最后得到变量的值。就上面这个例子而言,在RDF图中找到匹配的子图后,将"罗纳尔多·路易斯·纳萨里奥·德·利马"和“?x”绑定,我们就得到最后的结果。简而言之,SPARQL查询分为三个步骤:


1. 构建查询图模式,表现形式就是带有变量的RDF。

2. 匹配,匹配到符合指定图模式的子图。

3. 绑定,将结果绑定到查询图模式对应的变量上。



  二、例子  


以实践篇的RDF电影数据为例,我们介绍如何利用SPARQL查询:


1. 所有的RDF三元组。

2. 周星驰出演了哪些电影?

3. 英雄这部电影有哪些演员参演?

4. 巩俐参演的评分大于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: <XML Schema>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}



SPARQL的部分关键词:


  • SELECT, 指定我们要查询的变量。在这里我们查询所有的变量,用*代替。

  • WHERE,指定我们要查询的图模式。含义上和SQL的WHERE没有区别。

  • FROM,指定查询的RDF数据集。我们这里只有一个图,因此省去了FROM关键词。

  • PREFIX,用于IRI的缩写。


下面是该语句的部分查询结果:

       s                   p             o
db:genre/12 [http] :genreName "冒险"db:genre/12 [http] rdf:type :Genredb:genre/14 [http] :genreName "奇幻"db:genre/14 [http] rdf:type :Genredb:genre/16 [http] :genreName "动画"db:genre/16 [http] rdf:type :Genredb:genre/18 [http] :genreName "剧情"db:genre/18 [http] rdf:type :Genredb:genre/27 [http] :genreName "恐怖"db:genre/27 [http] rdf:type :Genre


“周星驰出演了哪些电影”:

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: <XML Schema>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}


部分结果:

n
"功夫""琉璃樽""英雄本色""少林足球""西游记第壹佰零壹回之月光宝盒""长江七号""西游记大结局之仙履奇缘""建国大业""审死官""龙在天涯""大内密探零零发"


就我们这个例子而言,可以不要“?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: <XML Schema>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}


结果:

n
"李连杰""梁朝伟""张曼玉""章子怡""甄子丹"



“巩俐参演的评分大于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: <XML Schema>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)}


结果:

n
"2046""Memoirs of a Geisha""荆轲刺秦王""大红灯笼高高挂""霸王别姬""活着""唐伯虎点秋香""秋菊打官司""菊豆""Hong gao liang""画魂""风月""Piao Liang Ma Ma""The Hand"


这里我们用到了FILTER关键词,可以对变量取值进行约束。


SPARQL更详细的语法和功能这里就不再多做介绍。读者可以参考W3C的文档(https://www.w3.org/TR/rdf-sparql-query/)或者SPARQL查询的例子(https://www.w3.org/2009/Talks/0615-qbe/),也有专门的书来讲解SPARQL 1.1(Learning SPARQL: Querying and Updating with SPARQL 1.1,可以关注我的公众号,点击“书单”菜单获取下载链接)


另外多提一点,关于知识图谱,有一个非常重要的概念,即开放世界假定(Open-world assumption,OWA,https://www.wikiwand.com/en/Open-world_assumption)。这个假定的意思是当前没有陈述的事情是未知的,或者说知识图谱没有包含的信息是未知的。怎么理解?首先我们要承认知识图谱无法包含所有完整的信息。以我们这个电影数据的例子而言,很明显,它的数据十分残缺。即使我们拥有一个十分完整的电影知识图谱,包含了当下所有的电影、演员等信息,在现实世界中,信息也是动态变化和增长的。即,我们要承认知识图谱的信息本身就是残缺的。有了这个前提,我们来思考例子中的第二个SPARQL语句:


周星驰出演了上述查询结果中的电影。基于我们构建的电影知识图谱,提问:周星驰出演了《卧虎藏龙》吗?根据OWA,我们得到的答案是“不知道”,相反,如果是封闭世界假定(Closed-world assumption),我们得到的答案是“没有出演”。


我们在设计本体和开发相关应用的时候需要考虑开放世界假定。举个简单的例子,基于知识图谱的问答系统,用户提问“周星驰出演了《卧虎藏龙》吗?”,合适的回答是“不知道”而不是“没有出演”。直觉上这和一个人向另一个人提这个问题一样,如果我们知道问题答案,我们会给出肯定的回答,不知道的话,我们往往倾向于回复“我不知道”,“我不太清楚”,“我查查看”,而不是信誓旦旦地回答“没有出演”。毕竟,大多数人都有“自知之明”,知道自己总有不了解的东西。从这个角度上说,人和知识图谱类似,我们都存在于OWA的世界中。



  三、总结  


本文主要介绍了RDF查询语言SPARQL及其基本用法,希望能让读者对SPARQL有个初步的认识。下一篇文章是实践篇,介绍如何利用D2RQ创建SPARQL endpoint并在我们的数据上进行相关查询。


参考资料:

1. Learn SPARQL - Cambridge Semantics (https://www.cambridgesemantics.com/blog/semantic-university/learn-sparql/)

2. SPARQL By Example (https://www.w3.org/2009/Talks/0615-qbe/)

3. SPARQL Query Language for RDF (https://www.w3.org/TR/rdf-sparql-query/)


推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
0

相关内容

SPARQL(读作“sparkle”,SPARQL协议和RDF查询语言的首字母缩写)是一种RDF查询语言,也就是说,它是一种语义查询语言,用于数据库检索和操作以资源描述框架(RDF)格式存储的数据。
最新《知识图谱:构建到应用》2020大综述论文,261页pdf
专知会员服务
291+阅读 · 2020年10月6日
专知会员服务
35+阅读 · 2020年9月25日
基于多来源文本的中文医学知识图谱的构建
专知会员服务
53+阅读 · 2020年8月21日
专知会员服务
144+阅读 · 2020年8月21日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
30+阅读 · 2020年4月12日
知识图谱融合方法,140页ppt,南京大学胡伟老师
专知会员服务
143+阅读 · 2020年2月19日
中文知识图谱构建技术以及应用的综述
专知会员服务
313+阅读 · 2019年10月19日
知识图谱本体结构构建论文合集
专知会员服务
107+阅读 · 2019年10月9日
技术动态 | 自底向上构建知识图谱全过程
开放知识图谱
8+阅读 · 2018年7月28日
论文浅尝 | 基于知识图谱子图匹配以回答自然语言问题
开放知识图谱
25+阅读 · 2018年6月26日
论文浅尝 | 基于知识图谱的子图匹配回答自然语言问题
开放知识图谱
27+阅读 · 2018年5月17日
领域应用 | CCKS-2017 行业知识图谱构建与应用-下篇
开放知识图谱
12+阅读 · 2017年9月21日
【知识图谱】如何构建知识图谱
产业智能官
134+阅读 · 2017年9月19日
【知识图谱】CCKS-2017 行业知识图谱构建与应用-下篇
揭开知识库问答KB-QA的面纱3·信息抽取篇
PaperWeekly
15+阅读 · 2017年8月14日
揭开知识库问答KB-QA的面纱1·简介篇
PaperWeekly
6+阅读 · 2017年8月3日
Arxiv
102+阅读 · 2020年3月4日
Arxiv
3+阅读 · 2018年4月5日
Arxiv
7+阅读 · 2018年1月30日
VIP会员
相关VIP内容
最新《知识图谱:构建到应用》2020大综述论文,261页pdf
专知会员服务
291+阅读 · 2020年10月6日
专知会员服务
35+阅读 · 2020年9月25日
基于多来源文本的中文医学知识图谱的构建
专知会员服务
53+阅读 · 2020年8月21日
专知会员服务
144+阅读 · 2020年8月21日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
30+阅读 · 2020年4月12日
知识图谱融合方法,140页ppt,南京大学胡伟老师
专知会员服务
143+阅读 · 2020年2月19日
中文知识图谱构建技术以及应用的综述
专知会员服务
313+阅读 · 2019年10月19日
知识图谱本体结构构建论文合集
专知会员服务
107+阅读 · 2019年10月9日
相关资讯
技术动态 | 自底向上构建知识图谱全过程
开放知识图谱
8+阅读 · 2018年7月28日
论文浅尝 | 基于知识图谱子图匹配以回答自然语言问题
开放知识图谱
25+阅读 · 2018年6月26日
论文浅尝 | 基于知识图谱的子图匹配回答自然语言问题
开放知识图谱
27+阅读 · 2018年5月17日
领域应用 | CCKS-2017 行业知识图谱构建与应用-下篇
开放知识图谱
12+阅读 · 2017年9月21日
【知识图谱】如何构建知识图谱
产业智能官
134+阅读 · 2017年9月19日
【知识图谱】CCKS-2017 行业知识图谱构建与应用-下篇
揭开知识库问答KB-QA的面纱3·信息抽取篇
PaperWeekly
15+阅读 · 2017年8月14日
揭开知识库问答KB-QA的面纱1·简介篇
PaperWeekly
6+阅读 · 2017年8月3日
Top
微信扫码咨询专知VIP会员