SPARQL查询语言
SPARQL的查询是基于结构化知识的,变无序数据为有序知识,让计算机理解Web信息,即语义Web。现如今,语义网适用于各个领域,包括语义出版、语义知识库等。SPARQL是针对以RDF框架进行存储的知识库进行检索的SQL语句,因此有一定SQL基础的话,学习会很容易。
1.概述
2.匹配模式
3.组织结果集
4.查询方式
5.使用方式
什么是语义网?
语义网是一种使用可以被计算机理解的方式描述事物的网络。
- 林俊杰是著名歌手。
- 小酒窝是林俊杰唱的。
- 林俊杰也是演员。
像这样的句子可以被人类理解。但是如何能够被计算机理解呢?
陈述是由语法规则构建的。一门语言的语法定义了构建该语言的陈述所需的规则。
这就是语义网的本质所在 - 以计算机应用程序可以理解的方式描述事物。
语义网和网页之间的链接没有关系。
语义网描述的是事物之间的关系(比方说 A 是 B 的一部分,而 Y 是 Z 的成员)以及事物的属性(例如尺寸、重量、使用期限和价格等等)。
资源描述框架
RDF(资源描述框架,Resource Description Framework)是一种用于描述网络上的信息和资源的的标记语言。
将信息至于 RDF 文件之中,这样的话,这些信息就有可能被计算机程序("web spiders")从网络中搜索、发现、摄取、筛选、分析和处理。
语义网使用 RDF 来描述网络资源。
如果希望学习更多关于 RDF 的知识,请参考 http://www.w3school.com.cn/rdf/index.asp 。
1.概述:
当信息被表示为RDF后,出于推理和应用开发的需要,我们需要能够存取其中的部分。也就是需要叫做SPARQL的语言,它能够让我们通过选择、抽取等方式很容易地从被表示为RDF的知识中获得特定的部分。SPARQL是专为RDF设计的,适合并依赖于万维网上的各种技术。
SPARQL基础设施:
想要执行一条SPARQL查询,就需要一个能执行查询的软件。能做到这一点的最常用的软件叫做三元组存储库。本质上,一个三元组存储库就是一个RDF的数据库。在网上可以下载到很多三元组存储库。在SPARQL的相关规范中,三元组存储库也称为图存储库。 在查询一个三元组存储库之前,需要先向其中填充RDF数据。大部分三元组存储库都提供批量上传的选项。也有一种称为SPARQL更新的机制,提供了一系列向三元组存储库中插入、加载及删除RDF的选项。
2.匹配模式:
2.1简单的查询
Data:
<http://example.org/book/book1>
<http://purl.org/dc/elements/1.1/title>
"SPARQL Tutorial" .
Query:
SELECT ?title
WHERE { <http://example.org/book/book1>
<http://purl.org/dc/elements/1.1/title>
?title . }
Result:
| Title |
SPARQL Tutorial |
例如,要在这段数据中做一个查询。找到这本书的书名。
在SPARQL中,我们可以将三元组中的任何一个元素替换为一个变量。变量的首字符是一个?(问号)。要引入一个变量表示所要查询的位置。
三元组存储库将接收这个图模式并尝试去找到能够匹配这个模式的那些三元组集合。因此找到了主谓一致的三元组。并返回它的宾语。
如这个例子中,Data中有一个三元组,在构建查询的时候,利用select关键词构造主语和谓语,宾语作为变量返回,系统会根据查询式构造一个三元组图模式与RDF库中的所有三元组进行匹配,将满足条件的结果返回。
2.2多个匹配
Data: @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name "Johnny Lee Outlaw" . _:a foaf:mbox <mailto:jlow@example.com> . _:b foaf:name "Peter Goodguy" . _:b foaf:mbox <mailto:peter@example.org> . _:c foaf:mbox <mailto:carol@example.org>.
Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox WHERE { ?x foaf:name ?name . ?x foaf:mbox ?mbox }
Result:

与turtle类似,PREFIX关键词指明各种各种URL的缩写。返回的结果中,每一格表示一个结果。
Data中的_:a _:b _:c是空白节点,没有具体意义,且字母不固定,只是用来区分不同的实体资源。
2.3条件限制
如果上述的简单查询不能满足查询需求,则需要对查询的结果进行一定的条件限制,常用的限制字段主要为:filter、optinal、union。
Filter:限制数字或字符串符合一定要求的结果。数值型数据类型(即整数型、小数)和日期/时间都支持小于、大于和等于运算。
Optional关键词告诉三元组存储库为特定的图模式返回结果——如果能找到。即对于待返回的查询而言,这个图模式未必要满足。
UNION关键词告诉三元组存储库返回那些仅匹配一个图模式或两个都匹配的结果。
通过例子来进行学习:
Data:
@prefix dc:<http://purl.org/dc/elements/1.1/> .
@prefix : <http://example.org/book/> .
@prefix ns: <http://example.org/ns#> .
:book1 dc:title "SPARQL Tutorial" .
:book1 ns:price .
:book2 dc:title "The Semantic Web" .
:book2 ns:price .
Query:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX ns: <http://example.org/ns#>
SELECT ?title ?price
WHERE { ?x ns:price ?price .
FILTER (?price )
?x dc:title ?title . }

可以看到,filter字段通过对price的限制,筛选出了price小于30的所有实体,并返回title和price。
Data:
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix : <http://example.org/book/> .
@prefix ns: <http://example.org/ns#> .
:book1 dc:title "SPARQL Tutorial" .
:book1 ns:price .
:book2 dc:title "The Semantic Web" .
:book2 ns:price .
Query1:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE { ?x dc:title ?title
FILTER regex(?title, "^SPARQL")
}

Query2:
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE { ?x dc:title ?title
FILTER regex(?title, "web", "i" )
}

filter字段不仅可以对数字进行限制,还可以利用正则表达式进行对字符串的限制,filter加上regex,括号中表明变量?title,字符串str,即过滤出变量包含str的实体,str前面加^即表示以str开头,否则默认为包含有。
Data:
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
-rdf-syntax-ns#> .
_:a rdf:type foaf:Person .
_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@example.com> .
_:a foaf:mbox <mailto:alice@work.example> .
_:b rdf:type foaf:Person .
_:b foaf:name "Bob" .
Query:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE { ?x foaf:name ?name .
OPTIONAL { ?x foaf:mbox ?mbox }
}

Data:
@prefix dc10: <http://purl.org/dc/elements/1.0/> .
@prefix dc11: <http://purl.org/dc/elements/1.1/> .
_:a dc10:title "SPARQL Query Language Tutorial" .
_:a dc10:creator "Alice" .
_:b dc11:title "SPARQL Protocol Tutorial" .
_:b dc11:creator "Bob" .
_:c dc10:title "SPARQL" .
_:c dc11:title "SPARQL (updated)" .
Query:
PREFIX dc10: <http://purl.org/dc/elements/1.0/>
PREFIX dc11: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE { { ?book dc10:title ?title }
UNION { ?book dc11:title ?title }
}

OPTIONAL表示有则返回,没有则返回空。UNION表示满足任一即返回,相当于布尔逻辑中的OR。
3.组织结果集:
我们想要查询结果以一种特定的方式返回:分组的、计数的或排序的。SPARQL支持一些函数来帮助我们组织结果集。
Order: put the solutions in order
Distinct: ensure solutions in the sequence are unique
Reduced: permit elimination of some non-unique solutions
Offset: control where the solutions start from in the overall sequence of solutions
Limit: restrict the number of solutions
在更大的数据集上,我们可能不知道有多少条结果,或者我们的查询会不会返回整个数据集。因此,一个好的做法就是限制一条查询能返回的答案的数量。就是LIMIT关键词。
Query:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name }
LIMIT 20 //限制返回结果为20条
如果不使用DISTINCT/REDUCED关键词,结果集中会出现重复的结果。
Data:
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
_:x foaf:name "Alice" .
_:x foaf:mbox <mailto:alice@example.com> .
_:y foaf:name "Alice" .
_:y foaf:mbox <mailto:asmith@example.com> .
_:z foaf:name "Alice" .
_:z foaf:mbox <mailto:alice.smith@example.com> .
Query:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name }

Query:
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?name
WHERE { ?x foaf:name ?name }

DISTINCT关键字,可以保证结果唯一,REDUCED会对重复的结果进行适当的减少,不同的情况用不同的限制。
在SPARQL中,使用ORDER BY关键词来对返回的结果集排序。例如,按公寓所含卧室数量进行排序。
DESC关键词指明了按降序排列。ASC指的是升序。
此外,字符串得排序是根据字典序。

OFFSET和LIMIT关键词一起使用来选取不同的结果子集。
(前提是排序)
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE { ?x foaf:name ?name }
ORDER BY ?name
LIMIT
OFFSET 5 //表示对排序后的结果剔除前五个,返回一个,即第六个。
4.查询方式:
SPARQL有四种查询形式。
SELECT:在查询匹配模式中,返回所有的,或者部分子集。
CONSTRUCT:通过取代三元组中的变量,返回一个新RDF图模式。
ASK:返回一个布尔值,显示是否有匹配项。
DESCRIBE:返回一个表述资源的RDF图模式。
5.使用方式:
sparql的使用方式主要为两种,一种是网页知识库提供的查询端口,例如wikidata中提供的query service,在不同的知识库中有不同的词表属性,对不同的实体和属性有不同的ID号,需要另外学习,但是基本的语法基本一样,看几个例子便可以使用;第二种是利用Jena包编写代码进行自定义查询,当然还有很多工具平台也提供了sparql端口,例如D2RQ,但是它的底层实现也是基于Jena实现对于RDF的解析和可视化。
在一月份,我会把使用D2RQ和Jena解析的详细步骤进行记录和介绍。
SPARQL查询语言的更多相关文章
- Jena Fuseki 101
前言 正如其承诺的那样 Expose your triples as a SPARQL end-point accessible over HTTP. Fuseki provides REST-sty ...
- 语义Web和本体开发相关技术
在技术实现方面,语义Web和本体理论的研究日趋成熟,已经有许多成熟的工具或程序接口,诸如Jena.OWL API等API是系统实现的关键技术.这里介绍系统的可行性分析以及系统开发设计的关键技术. 1 ...
- Cypher查询语言--Neo4j 入门 (一)
目录 操作符 参数 标识符 注解 Start 通过id绑定点 通过id绑定关系 通过id绑定多个节点 所有节点 通过索引查询获取节点 通过索引查询获取关系 多个开始点 Cypher是一个描述性的图形 ...
- Jena搭建SPARQL查询RDF数据
1 Jena搭建SPARQL查询RDF数据 1.1 Jena概要 · SPARQL是W3C的RDF数据工作组设计的一种查询语言和协议,用于RDF数据的查询.经过类似于JDK安装时候的配置,可以在命令行 ...
- 知识图谱学习与实践(4)——通过例句介绍Sparql的使用
通过例句介绍Sparql的使用 1 简介 SPARQL的定义,是一个递归的定义,为SPARQL Protocal and RDF Query Language,是W3C制定的RDF知识图谱标准查询语言 ...
- SPARQL入门(一)SPARQL简介与简单使用
知识图谱(Knowledge Graph)是当前互联网最炙手可热的技术之一,它的典型应用场景就是搜索引擎,比如Google搜索,百度搜索.我们在百度搜索中输入问题"中国银行的总部在哪&q ...
- Neo4j Cypher查询语言详解
Cypher介绍 "Cypher"是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询.Cypher还在继续发展和成熟,这也就意味着有可能会出现 ...
- ThinkPHP3快速入门教程三:查询语言
一.查询语言简介: ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,查询条件可以用于读取.更新和删除等操作,主要涉及到where方法等连贯相关方法操作即可, 此框架查询系统可以解 ...
- Oracle数据库语言——结构化查询语言SQL
一.数据定义语言DDL 1.创建表空间:CREAT TABLESPACE lyy DATAFILE 'C:/app/lyy.dbf' SIZE 10M;(创建一个10M的表空间,存放在C盘app文件夹 ...
随机推荐
- SpringBoot之简单日志配置
我的目的指定一个文件夹输出:(不采用指定文件的原因是一个文件的大小时间长了会很大,不利于处理) logging: level: root: INFO org.sselab: controller: I ...
- pyqt5实现注册界面
__author__ = 'sign_in' import sys from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import * clas ...
- Rsync同步、Rsync+Lsync实时同步
Rsync同步.Rsync+Lsync实时同步 原创博文http://www.cnblogs.com/elvi/p/7658049.html #!/bin/sh #Myde by Elven @ #c ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Springboot Mybatis Redis 实现二级缓存
前言 什么是mybatis二级缓存? 二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace. 即,在不同的sqlsession中,相同的namespace下,相同 ...
- Python函数篇(3)-内置函数、文件处理
1.内置函数 上一篇文章中,我重点写了reduce.map.filter3个内置函数,在本篇章节中,会补充其他的一些常规内置函数,并重点写max,min函数,其他没有说明的函数,会在后面写到类和面向对 ...
- onblur
HTML onblur 事件属性 HTML 事件属性 实例 当用户离开输入字段时对其进行验证: <input type="text" name="fname&quo ...
- 浅析文本挖掘(jieba模块的应用)
一,文本挖掘 1.1,什么是文本挖掘 文本挖掘是指从大量文本数据中抽取事先未知的,可理解的,最终可用的知识的过程,同时运用这些知识更好的组织信息以便将来参考 1.2,文本挖掘基本流程 收集数据 数据集 ...
- Gitlab一键端的安装汉化及问题解决(2017/12/14目前版本为10.2.4)
Gitlab的安装汉化及问题解决 一.前言 Gitlab需要安装的包太TM多了,源码安装能愁死个人,一直出错,后来发现几行命令就装的真是遇到的新大陆一样... ... 装完之后感觉太简单,加了汉化补丁 ...
- 关于C语言中static保留字的使用
static存储类型可以用于全部变量,无需考虑变量声明的位置.但是作用于块外部和块内部时具有不同的作用. (1)当作用于函数内部时,和每次程序离开所在块就会丢失值的自 ...