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文件夹 ...
随机推荐
- 最简单的optparse模块的用法
optparse模块是python自带的模块,可用于处理命令行 #!/usr/bin/env python # -*- coding: utf-8 -*- """ __a ...
- TIJ学习总结(1)- Java基础语法
TIJ(Thinking in Java)作为Java学习书籍里的"圣经",之前花两个月系统的捋了一遍,很多东西有种豁然开朗的感觉,入门之后读一遍TIJ,相信会有很多意外收获哦- ...
- jfinal 源码学习
源由 最近闲来无事,顺带看了下jfinal的源码,以下均为自己的个人理解,如有错误请指定: jfinal 使用 在web.xml中配置JfinalFilter 并定义JfinalConfig的类 自定 ...
- Python [习题] 字典排序
[习题] 对此字典分别按照value 和key 如何排序? dic1 = {'and':40, 'a':54, 'is':60, 'path':139, 'the':124, 'os':49} In ...
- vue初级知识总结
从我第一篇博客的搭建环境开始,就开始学习vue了,一直想将这些基本知识点整理出来,但是一直不知如何下手,今天刚好实战了两个小demo,所以就想趁这机会将以前的一起整理出来,这是vue最基础的知识,我有 ...
- java equals 和 == 的区别
)1. == 可以用来比较基本类型以及引用类型.在基本类型中 == 比较的是两个变量的值是否相等.在引用类型中,== 比较的是两个对象的内存地址是否相等. )2. equals 只能用来比较引用类型. ...
- c++的引用和c的指针之创建链表,二叉树的烦恼和区别
/* **代码功能:创建一个令人头疼的不算头疼的链表,然后把特定的数据删除. *这次的主题不是在代码上,主要是关于创建链表时候的传参问题,嘿嘿,不相信你没遇到过 */#include "st ...
- <meta http-equiv="X-UA-Compatible" content="IE=edge">的作用
X-UA-Compatible是针对ie8新加的一个设置,对于ie8之外的浏览器是不识别的. X-UA-Compatible 是针对 IE8 版本的一个特殊文件头标记,用于为 IE8 指定不同的页面渲 ...
- 利用python对excel进行数据剔除
需求分析: 判断excel2表中的某个唯一字段是否满足条件,如果满足条件,就在excel1中进行查询,若存在excel中,就将该数据进行剔除. python脚本的实现: from __future__ ...
- null id in entry (don't flush the Session after an exception occurs) 解决方法
最近在学习基于ssh的注解的系统,然后在实现往数据库增加记录时可以增加第一个,第二个就报错,在网上查了很多资料,大多都是 该异常信息是在提示我们没有为数据中的非空字段设置值. 然后就一直没有明白 明明 ...