通过例句介绍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

sterfdatum@nl

http://www.w3.org/2002/07/owl#equivalentProperty

ημερομηνία_θανάτου@el

http://www.w3.org/2002/07/owl#equivalentProperty

没年月日@ja

http://www.w3.org/2002/07/owl#equivalentProperty

resting date@en

http://www.w3.org/2002/07/owl#equivalentProperty

埋葬年月日@ja

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的使用的更多相关文章

  1. 知识图谱学习与实践(4)——Protégé使用入门

    1 Protégé简介 Protégé是一个本体建模工具软件,由斯坦福大学基于java语言开发的,属于开放源代码软件.软件主要用于语义网中本体的构建和基于本体的知识应用,是本体构建的核心开发工具,最新 ...

  2. 知识图谱学习与实践(6)——从结构化数据进行知识抽取(D2RQ介绍)

    1 概述 D2RQ,含义是把关系型数据库当作虚拟的RDF图数据库进行访问.D2RQ平台是一个将关系型数据库当作虚拟的.只读的RDF图数据库进行访问的系统.提供了基于RDF访问关系数据库的内容,而无需复 ...

  3. 知识图谱推理与实践 (2) -- 基于jena实现规则推理

    本章,介绍 基于jena的规则引擎实现推理,并通过两个例子介绍如何coding实现. 规则引擎概述 jena包含了一个通用的规则推理机,可以在RDFS和OWL推理机使用,也可以单独使用. 推理机支持在 ...

  4. 知识图谱推理与实践(3) -- jena自定义builtin

    在第2篇里,介绍了jena的The general purpose rule engine(通用规则引擎)及其使用,本篇继续探究,如何自定义builtin. builtin介绍 先回顾builtin为 ...

  5. Atitit learn by need 需要的时候学与预先学习知识图谱路线图

    Atitit learn by need 需要的时候学与预先学习知识图谱路线图 1. 体系化是什么 架构 知识图谱路线图思维导图的重要性11.1. 体系就是架构21.2. 只见树木不见森林21.3. ...

  6. 如何系统学习知识图谱-15年+IT老兵的经验分享

    一.前言 就IT而言,胖子哥算是老兵,可以去猝死的年纪,按照IT江湖猿龄的规矩,也算是到了耳顺之年:而就人工智能而言,胖子哥还是新人,很老的新人,深度学习.语音识别.人脸识别,知识图谱,逐个的学习了一 ...

  7. 知识图谱与机器学习 | KG入门 -- Part1-b 图深度学习

    介绍 我们正在定义一种新的机器学习方法,专注于一种新的范式 -- Data Fabric. 在上一篇文章中,我们对机器学习给出了新的定义: 机器学习是一种自动发现Data Fabric中隐藏的&quo ...

  8. 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用

    4.(2021.6.24)Briefings-生物信息学中的图表示学习:趋势.方法和应用 论文标题: Graph representation learning in bioinformatics: ...

  9. 学习笔记之知识图谱 (Knowledge Graph)

    Knowledge Graph - Wikipedia https://en.wikipedia.org/wiki/Knowledge_Graph The Knowledge Graph is a k ...

随机推荐

  1. Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  2. mouseover和mouseout事件引发的BUG-解决方法

    mouseover和mouseout引发的BUG原由 当给一个元素添加mouseover或mouseout事件,这个元素还有子元素. 由于子元素的事件冒泡,鼠标移入或移出子元素都会触发事件. 解决的方 ...

  3. 给你的 GitHub Repository 加上 sponsor 按钮

    「本文微信公众号 AndroidTraveler 首发」 背景 其实之前 GitHub 就已经说过要给开源的开发者提供赞助支持. 当你进入 GitHub 主页时,你会在右边发现一个 Tips. 点击进 ...

  4. Docker环境下的前后端分离项目部署与运维(十一)Docker Swarm技术

    Docker Swarm技术 docker swarm技术(之前的docker集群都是在 一个虚拟主机上的,但是如果这个主机挂掉了over了,docker技术就是多个虚拟主机形成一个集群) Swarm ...

  5. 实战Java的反射机制

    众所周知,Java要调用某个对象的方法首先需要对象实例化后才能调用. 而实例化对象常见的就是new执行和spring(DI)的依赖注入了. Spring的DI其实就是以反射作为最基础的技术手段. 一. ...

  6. Anaconada安装

    目录 Anaconda介绍 Anaconda下载 安装Anaconda 配置环境变量 管理虚拟环境 activate 切换环境 卸载环境 关于环境总结 安装第三方包 卸载第三方包 查看环境包信息 导入 ...

  7. Java学习笔记——XML入门

    以下内容来自网络 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language). XML 是一种很像HTML的标记语言. XML 的设计宗旨是传输数据,而不是显示 ...

  8. Python random() 生成随机数

    random() 函数中常见的函数如下: #!/usr/bin/python # -*- coding: UTF-8 -*- import random print( random.randint(1 ...

  9. 就是要让你彻底学会 @Bean 注解

    @Bean 注解全解析 随着SpringBoot的流行,基于注解式开发的热潮逐渐覆盖了基于XML纯配置的开发,而作为Spring中最核心的bean当然也能够使用注解的方式进行表示.所以本篇就来详细的讨 ...

  10. C# Linq 常用查询操作符

    限定操作: 1. All:用来确定是否序列中的所有元素都满足条件 2. Any:用来确定序列是否包含任何元素,有参方式用来确定序列中是否有元素满足条件 3. Contains:方法用来确定序列是否包含 ...