知识图谱学习与实践(4)——通过例句介绍Sparql的使用
通过例句介绍Sparql的使用
1 简介
SPARQL的定义,是一个递归的定义,为SPARQL Protocal and RDF Query Language,是W3C制定的RDF知识图谱标准查询语言,大部分的图数据库都支持SPARQL查询。SPARQL在语法上借鉴了SQL。SPARQL是针对RDF三元组进行查询,通过图匹配的方式获得需要查找的内容。
下面通过一个例子来说明SPARQL的查询语句的基本结构。这个例子可以在http://dbpedia.org/sparql中运行,获取结果。
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
from <http://dbpedia.org>
where {ontology:deathDate ?p ?o}
LIMIT 10
查询例句,包括了5个部分。
第一部分是前缀声明,这部分主要是为了后面查询内容的简洁,本例中用ontology代替http://dbpedia.org/ontology/,在后面的查询中直接使用ontology,比如ontology:deathDate就表示http://dbpedia.org/ontology/deathDate,
第二部分是select子句,用来确定需要查找的内容。以变量的形式体现,本例中就是查找?p和?o,按照三元组的主谓宾结构,这里查找的是谓语和宾语,分别用带问号的字符(串)来表示。
第三部分是from子句,用来确定从哪个图数据库中查找,类似于关系数据库的表名。本例需要查找的数据是在图数据库http://dbpedia.org中进行查找。也可以把http://dbpedia.org这个Graph IRI放到第一个方框内,作为默认的数据集名称。
第四部分是where子句,这部分是用来匹配三元组,把需要匹配的内容放到{}中,本例中,ontology:deathDate ?p ?o的含义就是主语是ontology:deathDate,即http://dbpedia.org/ontology/deathDate,谓语是?p,宾语是?o,匹配这个内容结构的所有三元组,也就是找出主语是http://dbpedia.org/ontology/deathDate的所有三元组。
第五部分是查询修正的内容,类似于关系数据查询最后的一些限定子句,比如排序order by,限定前几个输出的limit等。本例就是用的limit 10,限定只输出10个结果。
查询结果如下
|
p |
o |
|
http://www.w3.org/1999/02/22-rdf-syntax-ns#type |
http://www.w3.org/2002/07/owl#FunctionalProperty |
|
http://www.w3.org/1999/02/22-rdf-syntax-ns#type |
http://www.w3.org/1999/02/22-rdf-syntax-ns#Property |
|
http://www.w3.org/1999/02/22-rdf-syntax-ns#type |
http://www.w3.org/2002/07/owl#DatatypeProperty |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
http://www.wikidata.org/entity/P570 |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
http://schema.org/deathDate |
|
http://www.w3.org/2000/01/rdf-schema#label |
"Sterbedatum"@de |
|
http://www.w3.org/2000/01/rdf-schema#label |
"date de décès"@fr |
|
http://www.w3.org/2000/01/rdf-schema#label |
"death date"@en |
|
http://www.w3.org/2000/01/rdf-schema#label |
"sterfdatum"@nl |
|
http://www.w3.org/2000/01/rdf-schema#label |
"ημερομηνία_θανάτου"@el |
2 一些常用的查询语句
2.1 最简单的查询
就像SQL语句中的查询所有内容select * from table,SPARQL也有一个查询全部数据的语句,也是最简单的语句。
select ?s ?p ?o where {?o ?p ?o}
这个语句可以查看图数据库里面的所有三元组,不过如果数据集比较庞大,可能发生延时错误,也就是在一定的时间内查询不能完成导致最后无法完成查询,从而不能提供查询结果。
2.2 聚合函数
在SPARQL中,也有类似SQL中的聚合函数,比如count,比较常用的一个就是查询图数据库的三元组数量。
select count(?s) where {?o ?p ?o}
我们用上面的语句查询http://dbpedia.org中三元组的数量,我查了几次,有几次是给出延时错误,有的时候能给出结果。
|
callret-0 |
|
316290000 |
可以看到,http://dbpedia.org这个图数据库一共有3亿多条数据。
2.3 opional过滤
使用optional,可以起到过滤的作用,如果满足optional后面匹配的条件,则结果显示出来。比如下面的语句
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
where {{?s ?p <http://schema.org/deathDate>} optional {?s <http://www.w3.org/2000/01/rdf-schema#label> ?o}}
查询的含义是先查找宾语是http://schema.org/deathDate 的主语?s和谓语?p,将主语?s满足模式?s <http://www.w3.org/2000/01/rdf-schema#label> ?o的内容找出来,最后显示出两个条件都满足的结果,也可以理解为,通过optional后面的子句过滤掉一部分第一个子句的结果,得到最终的结果。
|
p |
o |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
Sterbedatum@de |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
date de décès@fr |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
death date@en |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
|
|
http://www.w3.org/2002/07/owl#equivalentProperty |
|
|
http://www.w3.org/2002/07/owl#equivalentProperty |
|
|
http://www.w3.org/2002/07/owl#equivalentProperty |
resting date@en |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
2.4 union全集
union也是一个在SPARQL中常用的关键字,使用union表示,将所有union连接的子句匹配的结果都显示出来。我们还用2.3的例子,不过把optional替换为union,可以比较一下二者的不同。
查询语句为
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
where {{?s ?p <http://schema.org/deathDate>} union {?s <http://www.w3.org/2000/01/rdf-schema#label> ?o}}
查询结果为(部分结果)

从结果可以看出,optional和union的差别还是很明显的,optional是过滤,union是全集,是并的操作。
2.5 模糊查询
在SQL中的like查询,在SPARQL中也有对应的语句,就是使用FILTER 和regex。
例句为
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
where {ontology:deathDate ?p ?o filter regex(?p,'label')}
还是查找主语deathDate这个主语的谓语和宾语列表,模糊查询的是谓语中含有’label’的谓语和宾语,这个filter和regex的组合实现的功能就是类似SQL的like功能。
查询结果为
|
p |
o |
|
http://www.w3.org/2000/01/rdf-schema#label |
Sterbedatum@de |
|
http://www.w3.org/2000/01/rdf-schema#label |
date de décès@fr |
|
http://www.w3.org/2000/01/rdf-schema#label |
death date@en |
|
http://www.w3.org/2000/01/rdf-schema#label |
sterfdatum@nl |
|
http://www.w3.org/2000/01/rdf-schema#label |
ημερομηνία_θανάτου@el |
|
http://www.w3.org/2000/01/rdf-schema#label |
没年月日@ja |
从结果可以看到,模糊查询中谓语只包含了有label的内容,其它的给过滤掉了。
3 结语
这里只是简单介绍了SPARQL的语法和常用的查询语句,实际环境中,应用SPARQL进行查询可能会复杂的多,会有很多复合语句,更为复杂的可能会跨数据集进行查询,也可能用到RDF的一些特性,比如只查找字面量或者只查找IRI的数据等等。总之,SPARQL查询,在实际的使用中,会碰到各种不同的需求,还要根据具体情况写出各种查询语句。
书写SPARQL查询语句的时候,还要细心,不能出错,不能写错一个字符,有的时候还要注意顺序,这些问题没有注意到,都可能导致查不到结果,或者是直接报错。在拼接SPARQL的时候,要多一些耐心,按照SPARQL规则来,循序渐进,慢慢就会初步掌握这种查询语言。
另外SPARQL还有UPDATE功能,有insert和delete关键字,但是没有update关键字,也就是说,SPARQL如果实现update操作,需要先insert再delete,从而达到update的效果。SPARQL的UPDATE功能,不如查询功能用的广泛,可能是因为数据集一般数据量大,都是直接以文件的形式存到数据库中的缘故。
本文通过例句的形式,介绍了SPARQL的基础知识,希望对大家学习sparql有帮助,在学习过程中,有什么问题,还是要多交流,共同进步。
参考资料
https://www.w3.org/TR/rdf-sparql-query/
知识图谱学习与实践(4)——通过例句介绍Sparql的使用的更多相关文章
- 知识图谱学习与实践(4)——Protégé使用入门
1 Protégé简介 Protégé是一个本体建模工具软件,由斯坦福大学基于java语言开发的,属于开放源代码软件.软件主要用于语义网中本体的构建和基于本体的知识应用,是本体构建的核心开发工具,最新 ...
- 知识图谱学习与实践(6)——从结构化数据进行知识抽取(D2RQ介绍)
1 概述 D2RQ,含义是把关系型数据库当作虚拟的RDF图数据库进行访问.D2RQ平台是一个将关系型数据库当作虚拟的.只读的RDF图数据库进行访问的系统.提供了基于RDF访问关系数据库的内容,而无需复 ...
- 知识图谱推理与实践 (2) -- 基于jena实现规则推理
本章,介绍 基于jena的规则引擎实现推理,并通过两个例子介绍如何coding实现. 规则引擎概述 jena包含了一个通用的规则推理机,可以在RDFS和OWL推理机使用,也可以单独使用. 推理机支持在 ...
- 知识图谱推理与实践(3) -- jena自定义builtin
在第2篇里,介绍了jena的The general purpose rule engine(通用规则引擎)及其使用,本篇继续探究,如何自定义builtin. builtin介绍 先回顾builtin为 ...
- Atitit learn by need 需要的时候学与预先学习知识图谱路线图
Atitit learn by need 需要的时候学与预先学习知识图谱路线图 1. 体系化是什么 架构 知识图谱路线图思维导图的重要性11.1. 体系就是架构21.2. 只见树木不见森林21.3. ...
- 如何系统学习知识图谱-15年+IT老兵的经验分享
一.前言 就IT而言,胖子哥算是老兵,可以去猝死的年纪,按照IT江湖猿龄的规矩,也算是到了耳顺之年:而就人工智能而言,胖子哥还是新人,很老的新人,深度学习.语音识别.人脸识别,知识图谱,逐个的学习了一 ...
- 知识图谱与机器学习 | KG入门 -- Part1-b 图深度学习
介绍 我们正在定义一种新的机器学习方法,专注于一种新的范式 -- Data Fabric. 在上一篇文章中,我们对机器学习给出了新的定义: 机器学习是一种自动发现Data Fabric中隐藏的&quo ...
- 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用
4.(2021.6.24)Briefings-生物信息学中的图表示学习:趋势.方法和应用 论文标题: Graph representation learning in bioinformatics: ...
- 学习笔记之知识图谱 (Knowledge Graph)
Knowledge Graph - Wikipedia https://en.wikipedia.org/wiki/Knowledge_Graph The Knowledge Graph is a k ...
随机推荐
- qt开发的小软件,可以递归转换文件编码(qt为了防止内存泄露所做的保护机制)
应用场景 当你下载别人的源码的时候,而别人的源码跟你自己电脑里面的编码不一致的情况下将会出现乱码,但是如果要一个个转换编码的话那么那样所需要花的时间太多,所以就有必要写一个软件递归遍历项目下面所有的文 ...
- 海康威视频监控设备Web查看系统(三):Web篇
声明:本系列文章只提供交流与学习使用.文章中所有涉及到海康威视设备的SDK均可在海康威视官方网站下载得到.文章中所有除官方SDK以为的代码均可随意使用,任何涉及到海康威视公司利益的非正常使用由使用者自 ...
- 【Web前端Talk】无聊吗?写个【飞机大战】来玩吧(下篇)
上一篇介绍了如何使用cocos creator开发游戏,此篇是详细介绍功能点以及如何部署打包至微信小游戏体验. 欢迎关注我们的公众号:Web前端Talk.前端文章持续更新. 资源管理制作 1.准备工具 ...
- Kafka笔记7
Kafka提供了一些命令行工具,用于管理集群变更.这些工具使用Java实现,Kafka提供了一些脚本调用这些Java类. 9.1主题操作 使用Kafka-topics.sh工具可以执行主题大部分工作, ...
- shell多线程之进程间通信(3)
之前的文章依赖是1对1或1多对的,但每个任务的前置任务都只有1个. 本文的核心在于一个任务依赖于多个任务的执行完成,如上图所示,这个任务就是fact,只有new和dviduser两个任务都完成的情况下 ...
- kubernetes使用http rest api访问集群之使用postman工具访问 apiserver
系列目录 前面一节我们介绍了使用curl命令行工具访问apiserver,命令行工具快速高效,但是对于输出非常长的内容查看不是特别方便,尤其终端界面输入的东西非常多的时候,过长的内容不是特别容易通过滚 ...
- 《菜鸟也要学会C》-和大家聊一聊
简介 为什么要出本系列作品? 怎么学好C? 学完这套课程后,我的编程会怎么样? 1.1为什么要出本系列作品? 随着大部分人喜欢编程,大部分人都有一个毛病,就是想要急切的学完编程.其实这种思想是错误的, ...
- chromedriver配置
需要先安装chrome浏览器,添加chrome源 sudo vim /etc/yum.repos.d/google-chrome.repo 添加以下内容 [google-chrome] name=go ...
- Ural 2062:Ambitious Experiment(树状数组 || 分块)
http://acm.timus.ru/problem.aspx?space=1&num=2062 题意:有n个数,有一个值,q个询问,有单点询问操作,也有对于区间[l,r]的每个数i,使得n ...
- Ural 2072:Kirill the Gardener 3(DP)
http://acm.timus.ru/problem.aspx?space=1&num=2072 题意:有n朵花,每朵花有一个饥渴值.现在浇花,优先浇饥渴值小的(即从小到大浇),浇花需要耗费 ...