1 introduction

definition cited from SPARQL 1.1 Overview:

SPARQL 1.1 is a set of specifications that provide languages and protocols to query and manipulate RDF graph content on the Web or in an RDF store.

I roughly divide W3C's SPARQL 1.1 Specifications into 5 parts:

This note is dedicated to record SPARQL languages(query, update), and Jena's ARQ(an implementation) supports.

2 language

No one really want to read the specifications directly, especially the unpatients, including myself. So I choose to stand on the shoulders of giants. Section 2.1 Query is mostly cited from [1].

2.1 Query

At first glance, SPARQL Query's key words seems to be copyed from Relational Storage Query language SQL. Be careful, although the key words may be familiar, the underlying modeling method and storage are different.

2.1.1 SELECT

(1) a sample with projection and modifier:

# prefixes
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

# select clause, with projection
SELECT ?sub ?prop ?obj
WHERE {
    ?sub ?prop ?obj.
}
LIMIT 0, 10 # using query modifier

The WHERE caluse is a specification of graph pattern, and each line in WHERE caluse is a triple, and should end with .. The notations that begin with ? are variables, and when SAPRQL endpoint generate a query answer, these variables should bind to a specific IRI resource.

(2) a sample cited from "Linked Data in Action" with additional RDF dataset and abbreviation of triple:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>

SELECT ?name ?latitude ?longitude
# named graph
FROM <http://3roundstones.com/dave/me.rdf>
FROM <http://semanticweb.org/wiki/Special:ExportRDF/Michael_Hausenblas>
WHERE {
   ?person foaf:name ?name ;
      foaf:based_near ?near .# abbreviation
   ?near pos:lat ?latitude ;
      pos:long ?longitude .
}

?person foaf:name ?name ;foaf:based_near ?near. uses an abbreviation of turtle syntax. Here are some forms of turtle syntax abbreviations:

a :b c.  ==   a :b c;
a :e f.         :e f.

a :b c.  ==  a :b c;  ==  a :b c,d
a :b d.        :b d.

The FROM caluses define so-called additional RDF dataset, without FROM, the default graph of SPARQL endpoint is used.

(3) queries with named graph and blank nodes

PREFIX tbl: <http://www.w3.org/People/Berners-Lee/card#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT *
FROM NAMED <http://www.koalie.net/foaf.rdf>
FROM NAMED <http://heddley.com/edd/foaf.rdf>
FROM NAMED <http://www.cs.umd.edu/∼hendler/2003/foaf.rdf>
FROM NAMED <http://www.dajobe.org/foaf.rdf>
FROM NAMED <http://www.isi.edu/∼gil/foaf.rdf>
FROM NAMED <http://www.ivan-herman.net/foaf.rdf>
FROM NAMED <http://www.kjetil.kjernsmo.net/foaf>
FROM NAMED <http://www.lassila.org/ora.rdf>
FROM NAMED <http://www.mindswap.org/2004/owl/mindswappers>
WHERE {
    GRAPH ?originGraph {
        _:blank1 foaf:knows _:blank2.
        _:blank2 rdf:type foaf:Person;
                foaf:nick ?nickname;
                foaf:name ?realname
    }
}

The FROM NAMED <IRI> caluses denote named graphs, they are used to indentify Resource's data sources. The GRAPH ?originGraph {<graph-pattern>} is used to define named graphs' patterns, ?originGraph is called the variable of named graph. Also we can explicitly assign a particular in the GRAPH caluse, here is a example:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?nickname
WHERE {
    GRAPH <http://www.w3.org/People/Berners-Lee/card> {
        :blank3 foaf:nick ?nickname
    }
}

Notations like _:blank1 are blank nodes, they play the same role just like Resource variables, but they could not be included in the query answers. Blank nodes has 2 forms of notaions:

_:blank :prop obj.   == [] :prop obj. or
                         [ :prop obj]

_:blank :prop1 obj1. == [:prop1 obj1]
_:blank :prop2 obj2.      :prop2 obj2.

sub :prop1 _:blank.   == sub :prop1 [:prop2 obj].
_:blank :prop2 obj. 

_:blank :prop1 obj1; == [:prop1 obj1;
        :prop2 obj2.       :prop2 obj2].

_:blank :prop obj1,  == [:prop obj1, obj2]
              obj2.

Query Modifiers

(1) DISTINCT

DISTINCT is used to remove duplicated result in query answers.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbprop: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT ?picture
WHERE {
    ?person rdfs:label "George Washington"@en;
        dbprop:occupation ?job;
        dbprop:birthPlace ?birthLoc;
        foaf:img ?picture
}
(2) REDUCED

Just like DISTINCT, excepte that SPARQL endpoint can return any number of duplicated results.

(3) ORDER BY

ORDER BY sort results using alphabetical order and numberic order, and uses ASC() order by default. Use DESC() to specify descented order.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbprop: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?job ?birthLoc ?picture
WHERE {
    ?person rdfs:label "George Washington"@en;
        dbprop:occupation ?job;
        dbprop:birthPlace ?birthLoc;
        foaf:img ?picture
}
ORDER BY ?birthLoc DESC(?job)
(4) OFFSET, LIMIT

OFFSET and LIMIT should play with ORDER BY, used to generate streaming results.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbprop: <http://dbpedia.org/property/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?job ?birthLoc ?picture
WHERE {
    ?person rdfs:label "George Washington"@en;
        dbprop:occupation ?job;
        dbprop:birthPlace ?birthLoc;
        foaf:img ?picture
}
ORDER BY ?birthLoc DESC(?job)
OFFSET 0 LIMIT 10
(5) FILTER

FILTER is used to filter query answer result through some boolean conditions.

These conditions can be specified using: (a) a subset of XQuery, XPath operators and functions, or (b) SPARQL specific operators.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbprop: <http://dbpedia.org/property/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?prop ?object
WHERE {
    ?person rdfs:label "George Washington"@en;
        dbprop:presidentStart ?start;
        ?prop ?object.
    FILTER(xsd:integer(?start) + 4 <= xsd:integer(?object))
}

The position of FILTER in WHERE clause is not important.

(6) OPTIONAL

OPTIONAL is used to add more graph patterns in WHERE caluses, while does not restrict results when there are no query bindings for these patterns.

PREFIX ex: <http://www.example.com/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbprop: <http://dbpedia.org/property/>
SELECT ?l1 ?l2 ?l3 ?l4
WHERE {
    ?person rdfs:label "George Washington"@en.
    ?l1 dbprop:namedFor ?person.
    OPTIONAL { ?l2 dbprop:blankInfo ?person }
    OPTIONAL { ?l3 ex:isNamedAfter ?person }
    OPTIONAL { ?person ex:wasFamousAndGaveNameTo ?l4 }
}
(7) UNION

UNION is used to aggregate results of two or more graph patterns to generate a new result.

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT *
WHERE {
    { ?unknown foaf:gender "male" }
    UNION
    { ?unknown foaf:gender "female" } .

    { ?unknown foaf:interest <http://www.iamhuman.com> }
    UNION
    { ?unknown foaf:interest <http://lovebeinghuman.org> }
}

CAUTION: No examples are expressed in CONSTRUCT, ASK and DESCRIBE.

2.1.2 CONSTRUCT

CONSTRUCT is used to transform datas from RDF datasets to datas in another RDF dataset.

2.1.3 ASK

ASK is used when you want to confirm whether a given graph pattern is exist in the SPARQL endpoint, it returns a boolean result.

2.1.4 DESCRIBE

DESCRIBE is used when query clients do not know the details of the structure of data, the SPARQL endpoint decides how to organize the data.

2.2 Update

TODO

3 language implementation: Jena ARQ

Using Jena with Apache Maven:

<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<type>pom</type>
<version>2.13.0</version>
</dependency>

3.1 API

3.1.1 query from model

see SelectQueryUsingModel.java

3.1.2 query from dataset

see SelectQueryUsingDataset.java

or paly with existed models:

Dataset dataset = DatasetFactory.create() ;
dataset.setDefaultModel(model) ;
dataset.addNamedModel("http://example/named-1", modelX) ;
dataset.addNamedModel("http://example/named-2", modelY) ;
 try(QueryExecution qExec = QueryExecutionFactory.create(query, dataset)) {
    ...
}

3.1.3 query from remote service

see SelectQueryUsingRemoteService.java

3.1.4 store resultset for later use

ResultSet results = qexec.execSelect() ;
results = ResultSetFactory.copyResults(results) ;
return results;

3.2 command line utilities

Classes are located in package arq.

(1) run a remote service query

java -cp .. arq.rsparql --service 'http://www.sparql.org/books/sparql'  \
   'PREFIX books:   <http://example.org/book/>  \
    PREFIX dc:      <http://purl.org/dc/elements/1.1/>  \
       SELECT ?book ?title WHERE   { ?book dc:title ?title }'

(2) run a remote service query with a local query file

java -cp .. arq.rsparql --service='http://www.sparql.org/books/sparql' \
 --file=query/books.rq

here query directory specified in --file arguments is in the CLASSPATH.

Other command line classes refer ARQ - Command Line Applications for more details.

(3) run with an OS script

cd $JENA_HOME/bin
./rsparql --service 'http://www.sparql.org/books/sparql' \
     'PREFIX books:   <http://example.org/book/> \
      PREFIX dc:      <http://purl.org/dc/elements/1.1/> \
      SELECT ?book ?title WHERE   { ?book dc:title ?title }'

# or
./rsparql --service='http://www.sparql.org/books/sparql' --file=./query/books.rq

3.3 other queries except SELECT

CONSTRUCT

QueryExecution qexec = ...;
Model resultModel = qexec.execConstruct() ;

DESCRIBE

QueryExecution qexec = ...;
Model resultModel = qexec.execDescribe() ;

ASK

QueryExecution qexec = ...;
boolean result = qexec.execAsk() 

resources and references

[1] Hebeler J, Fisher M, et al.Web 3.0与Semantic Web编程[M]. 清华大学出版社, 北京.2010

[2] SPARQLer - SPARQL online tools and resources collection

SPARQL1.1 101 Language and Jena support的更多相关文章

  1. Outline of Apache Jena Notes

    1 description 这篇是语义网应用框架Apache Jena学习记录的索引. 初始动机见Apache Jena - A Bootstrap 2 Content 内容组织基本上遵循Jena首页 ...

  2. Should You Build Your Own Backtester?

    By Michael Halls-Moore on August 2nd, 2016 This post relates to a talk I gave in April at QuantCon 2 ...

  3. OSCP Learning Notes - Privilege Escalation

    Privilege Escalation Download the Basic-pentesting vitualmation from the following website: https:// ...

  4. Spring.Net在Mvc4.0中应用的说明

    案例Demo:http://yunpan.cn/cJ5aZrm7Uybi3 访问密码 414b Spring.Net在Mvc4.0中应用的说明 1.引用dll 2.修改Global文件 (Spring ...

  5. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  6. F#之旅2 - 我有特别的学F#技巧

    原文地址:https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/learning-fsharp/ Learning F#Functio ...

  7. 【Java EE 学习 25 下】【网上图书商城js小技术点总结】

    1.日历控件的使用 日历控件源代码: /** * add auto hide when mouse moveout * * @version 1.0.1 * @date 2010-11-23 * @a ...

  8. Ubuntu 14.04 编译安装 boost 1.58

    简介 Boost is a set of libraries for the C++ programming language that provide support for tasks and s ...

  9. linux Centos 6.5 安装桌面环境GNOME

    在某种场合之下,我们使用的Linux还是要选择安装桌面环境的,所以在这里介绍一下如何给没有安装桌面环境的系统安装桌面环境.以Centos 6.5 为例演示一下如何安装桌面环境. 工具/原料 Linux ...

随机推荐

  1. chrome的timeline中stalled问题解析

    原文地址 :http://foio.github.io/chrome-stalled/ 在公司国做一个运营活动,上线后PM总是抱怨访问速度过慢,影响运营效果.然而从前端的角度来说我已经做了如下优化: ...

  2. iOS 使用Touch ID 校验[新增 iOS9 三种错误]

    iOS8后苹果开放了Touch ID的API给开发者,这也给我们的app带来了新的体验.开发者们可使用向第三方应用开放了Touch ID权限的API,以便他们在应用中使用指纹认证来完成用户认证或支付购 ...

  3. Linux下环境变量设置

    分类 Linux下的环境变量按生存周期来划分,可以划分为两种: 1)永久的:需要修改配置文件, 变量永久生效 2)临时的:直接在终端使用export命令声明即可,但是关闭shell后失效. 设置方法 ...

  4. python: 模块发布

    一.准备发布 1.为模块文件创建一个文件夹,并将模块文件复制到这个文件中(一般,文件夹的名字和模块的名字一样) 2.在文件夹中创建一个名为『setup.py』的文件,内容如下: #encoding:u ...

  5. 《BI项目笔记》数据源视图设置

    目的数据源视图是物理源数据库和分析维度与多维数据集之间的逻辑数据模型.在创建数据源视图时,需要在源数据库中指定包含创建维度和多维数据集所需要的数据表格和视图.BIDS与数据库连接,读取表格和视图定义, ...

  6. javaScript对文字按照拼音排序

    <title>JavaScript对文字按照拼音排序</title> <SCRIPT type="text/javascript"> funct ...

  7. python成长之路【第七篇】:面向对象

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向对象三大特性 面向 ...

  8. 学习mongo系列(一) win/mac安装 解析 连接

    一.安装mongo数据库 下载链接https://www.mongodb.org/downloads, 在执行如下命令的时候事先按照目录新建如下的目录:(如果数据库安装在D盘就在D盘的根目录下建)&q ...

  9. mac 启动apache + php

    一.启动Apache 在终端里输入命令,启动 Apache: sudo apachectl start 关闭 Apache: sudo apachectl stop 重启 Apache:sudo ap ...

  10. Uiautomator ——API详解

    版权声明:本文出自carter_dream的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4921701.html 简单的例子 以一个简 ...