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查询语言的更多相关文章

  1. Jena Fuseki 101

    前言 正如其承诺的那样 Expose your triples as a SPARQL end-point accessible over HTTP. Fuseki provides REST-sty ...

  2. 语义Web和本体开发相关技术

    在技术实现方面,语义Web和本体理论的研究日趋成熟,已经有许多成熟的工具或程序接口,诸如Jena.OWL API等API是系统实现的关键技术.这里介绍系统的可行性分析以及系统开发设计的关键技术. 1 ...

  3. Cypher查询语言--Neo4j 入门 (一)

    目录 操作符 参数 标识符 注解 Start 通过id绑定点 通过id绑定关系 通过id绑定多个节点 所有节点 通过索引查询获取节点 通过索引查询获取关系 多个开始点  Cypher是一个描述性的图形 ...

  4. Jena搭建SPARQL查询RDF数据

    1 Jena搭建SPARQL查询RDF数据 1.1 Jena概要 · SPARQL是W3C的RDF数据工作组设计的一种查询语言和协议,用于RDF数据的查询.经过类似于JDK安装时候的配置,可以在命令行 ...

  5. 知识图谱学习与实践(4)——通过例句介绍Sparql的使用

    通过例句介绍Sparql的使用 1 简介 SPARQL的定义,是一个递归的定义,为SPARQL Protocal and RDF Query Language,是W3C制定的RDF知识图谱标准查询语言 ...

  6. SPARQL入门(一)SPARQL简介与简单使用

      知识图谱(Knowledge Graph)是当前互联网最炙手可热的技术之一,它的典型应用场景就是搜索引擎,比如Google搜索,百度搜索.我们在百度搜索中输入问题"中国银行的总部在哪&q ...

  7. Neo4j Cypher查询语言详解

    Cypher介绍 "Cypher"是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询.Cypher还在继续发展和成熟,这也就意味着有可能会出现 ...

  8. ThinkPHP3快速入门教程三:查询语言

    一.查询语言简介: ThinkPHP内置了非常灵活的查询方法,可以快速的进行数据查询操作,查询条件可以用于读取.更新和删除等操作,主要涉及到where方法等连贯相关方法操作即可, 此框架查询系统可以解 ...

  9. Oracle数据库语言——结构化查询语言SQL

    一.数据定义语言DDL 1.创建表空间:CREAT TABLESPACE lyy DATAFILE 'C:/app/lyy.dbf' SIZE 10M;(创建一个10M的表空间,存放在C盘app文件夹 ...

随机推荐

  1. 如何在 Centos7 中安装 nginx

    1. 添加 nginx 的 yum 源(官网安装说明) vi /etc/yum.repos.d/nginx.repo 在该文件中添加如下内容: [nginx]name=nginx repobaseur ...

  2. 在ERP中定义用户时报错:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间

    在ERP中定义用户时.   报错: SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间. 原因分析: ①没有正确初 ...

  3. python从2.7升级到3.5 需要主要的问题

    今天鼓足勇气把我们python从2.7升级到3.5.我用的是pycharm开发工具.升级过程遇到一些问题小结下: 1.右击项目: 找到左侧 project interpreter选项,配置项目开发环境 ...

  4. Dom模型

    1.dom之对象分类 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  5. Anaconda 安装 Python 库(MySQLdb)的方法

    [已解决]Anaconda 安装 Python 库(MySQLdb)的方法 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 201 ...

  6. thinkphp框架知识点

    基本配置 define('APP_DEBUG',true);//开启debug模式 //记录日志 'LOG_RECORD' => true, //系统日志在记录的时候需要开启debug调试模式, ...

  7. gitup问题的处理

    在使用本地建立git仓库后,准备使用 因为之前已经登录了,所以没有给登录的命令行 1.git init         命令初始化仓库 2.git add .     命令将所有的文件传输到git仓库 ...

  8. HDU5804--Price List

    Price List Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others) Tot ...

  9. HDU 5194 DZY Loves Balls

    DZY Loves Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  10. 逐步搭建Lamp环境之vim的三种模式以及基本命令

    在Linux中vim的三种模式分别为:命令模式.末行模式.编辑模式.以下是三者的关系图: 三种模式的彼此切换: 命令模式是vim中的默认模式. 命令模式切换至末行模式: 使用英文冒号(:). 末行模式 ...