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文件夹 ...
随机推荐
- SAX解析文件
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import ja ...
- 【源码解析】Sharding-Jdbc中的算法
Sharding-jdbc中的很多地方涉及到算法,比如主从配置这块.分库分表这块.本文主要从源码角度介绍下,目前主要包含哪些算法,以及这些算法的内容. 一.读写分离(主从配置) 这块的代码主要在cor ...
- MyBatis开发学习记录
使用MyBatis时主要是完成POJO和SQL的映射规则 MyBatis基本构成: SqlSessionFactoryBuilder SqlSessionFactory SqlSession SqlM ...
- iOS上new Date异常解决办法
最近有一个项目要实现使用Angluar写一个简历模板, 用户输入姓名/生日/简介...等内容, 然后生成一份在线的简历 后来测试时遇到简历模板在Android手机跟Google浏览器上根据生日计算得出 ...
- O(N^2)最长上升子序列
//最长上升子序列o(N^2)可以不连续的子序列, //状态为maxlen[i]表示以a[i]为终点最大上升子序列长度 #include<iostream> #include<cst ...
- php面试之数据结构和算法
二.数据结构和算法 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口)(腾讯) <?php class T ...
- 了解web及网络基础
了解web及网络基础 以下内容简单的说明了一下TCP/IP协议族中HTTP协议.DNS服务.IP协议的一些概念和关系.笔者只是对知识点进行了总结,仅供参考: ) 转载请注明出处:了解web及网络基础 ...
- UWP Flyout浮动控件
看见没,点击"Options"按钮,浮动出来一个界面,这个界面可以用xaml自定义. 如果要点击的控件又Flyout属性那么,可以直接按照下面用 <Button Conten ...
- UWP 五星好评
var pfn = Package.Current.Id.FamilyName; await Launcher.LaunchUriAsync(new Uri("ms-windows-stor ...
- Codeforces 817F MEX Queries
题意:对一个维护三种操作:1.将[l..r]中的数全部加入集合中.2.将集合中[l..r]范围内的数删去.3.将集合中在[l..r]中的数删去,并将之前不在集合中的数加入集合 考虑到最近线段树总是写爆 ...