SPARQL

一、简介

       作为一种查询语言,SPARQL是“面向数据的”,因为它只查询模型中保存的信息;查询语言本身没有推理。SPARQL除了以查询的形式获取应用程序所需内容的描述,并以一组绑定或RDF图的形式返回该信息外,什么也不做。

执行sparql查询:

 sparql.bat --data=../vc-db-1.rdf --query=q-bp1.rq

        

算术表达式必须在圆括号(圆括号)中。如(?number>30000) 

 

 二、字符串匹配

        SPARQL提供了一个基于正则表达式测试字符串的操作。这包括请求SQL“LIKE”样式测试的能力,尽管正则表达式的语法不同于SQL。语法如下:

FILTER regex(?x, "pattern" [, "flags"])

flags:可选的,标志“i”表示完成了不区分大小写的模式匹配。

三、BLANK NODE

PREFIX vcard:      <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?y ?givenName
WHERE
 { ?y vcard:Family "Smith" .
   ?y vcard:Given  ?givenName .
 }

 

以_:开头的奇怪的qname。这不是空白节点的内部标签——是ARQ将它们打印出来,并分配了_:b0, _:b1来显示两个空白节点是否相同。在这里它们是不同的。它不会显示空白节点使用的内部标签,尽管在使用Java API时可以使用该标签。

四、可选信息(Optional Information)

4.1.简介

        RDF是半结构化数据,因此SPARQL具有查询数据的能力,但在数据不存在时不会查询失败。查询使用可选部分来扩展在查询解决方案中找到的信息,但无论如何都会返回非可选信息。

<rdf:RDF
    xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
    xmlns:vCard='http://www.w3.org/2001/vcard-rdf/3.0#'
    xmlns:info='http://somewhere/peopleInfo#'
    >

  <rdf:Description rdf:about="http://somewhere/JohnSmith">
    <vCard:FN>John Smith</vCard:FN>
    <info:age rdf:datatype='http://www.w3.org/2001/XMLSchema#integer'>25</info:age>
    <vCard:N rdf:parseType="Resource">
	    <vCard:Family>Smith</vCard:Family>
	    <vCard:Given>John</vCard:Given>
    </vCard:N>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/RebeccaSmith">
    <vCard:FN>Becky Smith</vCard:FN>
    <info:age rdf:datatype='http://www.w3.org/2001/XMLSchema#integer'>23</info:age>
    <vCard:N rdf:parseType="Resource">
	    <vCard:Family>Smith</vCard:Family>
	    <vCard:Given>Rebecca</vCard:Given>
    </vCard:N>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/SarahJones">
    <vCard:FN>Sarah Jones</vCard:FN>
    <vCard:N rdf:parseType="Resource">
	    <vCard:Family>Jones</vCard:Family>
	    <vCard:Given>Sarah</vCard:Given>
    </vCard:N>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/MattJones">
    <vCard:FN>Matt Jones</vCard:FN>
    <vCard:N
	      vCard:Family="Jones"
	      vCard:Given="Matthew"/>
  </rdf:Description>

</rdf:RDF>
这个查询获取一个人的名字,如果该信息可用,还可以获取他们的年龄。

PREFIX info:    <http://somewhere/peopleInfo#>
PREFIX vcard:   <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name ?age
WHERE
{
    ?person vcard:FN  ?name .
    OPTIONAL { ?person info:age ?age }
}

查询结果:
        

PREFIX info:   <http://somewhere/peopleInfo#>
PREFIX vcard:  <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name ?age
WHERE
{
    ?person vcard:FN  ?name .
    ?person info:age ?age .
}

查询结果:

 4.2. 可选过滤器(OPTIONALs with FILTERs)

        OPTIONAL是一个组合两个图形模式的二进制运算符。可选模式是任何组模式,可能涉及任何SPARQL模式类型。如果组匹配,则扩展解,如果不匹配,则给出原始解

        ①

PREFIX info:        <http://somewhere/peopleInfo#>
PREFIX vcard:      <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name ?age
WHERE
{
    ?person vcard:FN  ?name .
    OPTIONAL { ?person info:age ?age . FILTER ( ?age > 24 ) }
}

 查询结果:

 ②如果将过滤条件移出可选部分,则它可能会影响解的数量,但可能需要使过滤器更复杂,以允许变量年龄被解除绑定

PREFIX info:        <http://somewhere/peopleInfo#>
PREFIX vcard:      <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name ?age
WHERE
{
    ?person vcard:FN  ?name .
    OPTIONAL { ?person info:age ?age . }
    FILTER ( !bound(?age) || ?age > 24 )
}

查询结果:

如果一个解有一个年龄变量,那么它必须大于24。它也包括非绑定的。 

4.3. 可选项和顺序相关查询(OPTIONALs and Order Dependent Queries)

rdf文件:

<rdf:RDF
  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
  xmlns:vCard='http://www.w3.org/2001/vcard-rdf/3.0#'
  xmlns:info='http://somewhere/peopleInfo#'
  xmlns:foaf='http://xmlns.com/foaf/0.1/'
   >

  <!-- both vCard:FN and foaf:name have values, and the values are the same -->
  <foaf:Person rdf:about="http://somewhere/JohnSmith">
    <vCard:FN>John Smith</vCard:FN>
    <foaf:name>John Smith</foaf:name>
  </foaf:Person>

  <!-- both vCard:FN and foaf:name have values, but the values are not the same -->
  <foaf:Person rdf:about="http://somewhere/RebeccaSmith">
    <vCard:FN>Becky Smith</vCard:FN>
    <foaf:name>Rebecca Smith</foaf:name>
  </foaf:Person>

  <!-- only vCard:FN has values -->
  <foaf:Person rdf:about="http://somewhere/SarahJones">
    <vCard:FN>Sarah Jones</vCard:FN>
  </foaf:Person>

  <!-- only foaf:name has values -->
  <foaf:Person rdf:about="http://somewhere/MattJones">
    <foaf:name>Matthew Jones</foaf:name>
  </foaf:Person>

  <!-- neither vCard:FN nor foaf:name have values -->
  <foaf:Person rdf:about="http://somewhere/AdamJones" />

</rdf:RDF>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name
WHERE
{
  ?x a foaf:Person .
  OPTIONAL { ?x foaf:name ?name }
  OPTIONAL { ?x vCard:FN  ?name }
}

        如果第一个optional将?name和?x绑定到某些值,那么第二个optional将尝试匹配基础三元组(?X和?name有值)。如果第一个可选选项与可选部分不匹配,那么第二个可选选项将尝试用两个变量匹配其三重变量。

        查询结果:

五、模式中的备选方案(Alternatives in a Pattern) 

5.1. UNION -访问相同数据的两种方式

以下为Turtle RDF格式的RDF文件,文件后缀为.ttl

@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> .

_:a foaf:name   "Matt Jones" .

_:b foaf:name   "Sarah Jones" .

_:c vcard:FN    "Becky Smith" .

_:d vcard:FN    "John Smith" .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name
WHERE
{
   { [] foaf:name ?name } UNION { [] vCard:FN ?name }
}

查询结果:

名称使用哪种形式的表达式并不重要,?name变量已经设置。这可以使用FILTER实现,如下查询所示: 

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name
WHERE
{
  [] ?p ?name
  FILTER ( ?p = foaf:name || ?p = vCard:FN )
}

5.2. UNION -记住在哪里找到数据

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name1 ?name2
WHERE
{
   { [] foaf:name ?name1 } UNION { [] vCard:FN ?name2 }
}

---------------------------------
| name1         | name2         |
=================================
| "Matt Jones"  |               |
| "Sarah Jones" |               |
|               | "Becky Smith" |
|               | "John Smith"  |
---------------------------------

 5.3. OPTIONAL and UNION

        在实践中,OPTIONAL比UNION更常见,但它们都有各自的用途。OPTIONAL用于扩展找到的解决方案,UNION用于连接来自两个可能性的解决方案。它们不一定以相同的方式返回信息:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>

SELECT ?name1 ?name2
WHERE
{
  ?x a foaf:Person
  OPTIONAL { ?x  foaf:name  ?name1 }
  OPTIONAL { ?x  vCard:FN   ?name2 }
}

---------------------------------
| name1         | name2         |
=================================
| "Matt Jones"  |               |
| "Sarah Jones" |               |
|               | "Becky Smith" |
|               | "John Smith"  |
---------------------------------

六、datasets

6.1 入门案例

        RDF数据集是SPARQL查询查询的单元。它由一个默认图和一些命名图组成。

        图匹配操作(基本模式、可选选项和联合)在一个RDF图上工作。这开始是数据集的默认图,但它可以通过GRAPH关键字更改。

GRAPH uri { ... pattern ... }

GRAPH var { ... pattern ... }

1.如果给出了URI,则模式将与数据集中具有该名称的图进行匹配——如果没有,则graph子句根本无法匹配。

2.如果给出了变量,则尝试所有已命名的图(不是默认图)。该变量可以在其他地方使用,以便在执行期间,如果某个解决方案已经知道它的值,则只尝试特定的命名图。

 举例:

        RDF数据集可以采用多种形式。两种常见的设置是将默认图作为所有已命名图的联合(RDF合并),或者将默认图作为已命名图的目录(它们来自哪里,何时读取等)。没有限制-一个图可以在不同的名称下包含两次,或者一些图可以与其他图共享三元组。

Default graph (ds-dft.ttl):

@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<ds-ng-1.ttl> dc:date "2005-07-14T03:18:56+0100"^^xsd:dateTime .
<ds-ng-2.ttl> dc:date "2005-09-22T05:53:05+0100"^^xsd:dateTime .

Named graph (ds-ng-1.ttl):

@prefix dc: <http://purl.org/dc/elements/1.1/> .

[] dc:title "Harry Potter and the Philospher's Stone" .
[] dc:title "Harry Potter and the Chamber of Secrets" .

Named graph (ds-ng-2.ttl):

@prefix dc: <http://purl.org/dc/elements/1.1/> .

[] dc:title "Harry Potter and the Sorcerer's Stone" .
[] dc:title "Harry Potter and the Chamber of Secrets" .

        也就是说,我们有两个描述一些书籍的小图,我们有一个默认图,它记录了这些图最后一次阅读的时间。

查询可以在命令行应用程序中运行:

java -cp ... arq.sparql
    --graph ds-dft.ttl --namedgraph ds-ng-1.ttl --namedgraph ds-ng-2.ttl
    --query query file


//在命令行中是一行,官网样例



//自己实测应该为
arq --graph ds-dft.ttl --namedgraph ds-ng-1.ttl --namedgraph ds-ng-2.ttl --query q-ds-1.rq
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <.>

SELECT *
{ ?s ?p ?o }

(前缀:<.> 只是帮助格式化输出) 

查询结果:

         这只是默认的图-没有来自已命名图的任何内容,因为除非通过graph显式指示,否则不会查询它们

我们可以通过查询默认图和命名图来查询所有的三元组

PREFIX  xsd:    <http://www.w3.org/2001/XMLSchema#>
PREFIX  dc:     <http://purl.org/dc/elements/1.1/>
PREFIX  :       <.>

SELECT *
{
    { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}

查询结果:

如果应用程序知道命名图,它可以直接进行查询,例如查找给定图中的所有标题

PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <.>

SELECT ?title
{
  GRAPH :ds-ng-2.ttl
    { ?b dc:title ?title }
}

查询结果:
 

 6.2. Querying to find data from graphs that match a pattern

PREFIX  xsd:    <http://www.w3.org/2001/XMLSchema#>
PREFIX  dc:     <http://purl.org/dc/elements/1.1/>
PREFIX  :       <.>

SELECT ?date ?title
{
  ?g dc:date ?date . FILTER (?date > "2005-08-01T00:00:00Z"^^xsd:dateTime )
  GRAPH ?g
      { ?b dc:title ?title }
}

查询结果:

 6.3.Describing RDF Datasets - FROM and FROM NAMED

        查询执行可以在构建执行对象时给出数据集,也可以在查询本身中描述查询执行。当详细信息在命令行上时,将创建一个临时数据集,但应用程序可以创建数据集,然后在许多查询中使用它们。

        在查询中描述时,FROM <url>用于标识默认图中的内容。FROM子句可以有多个,默认图是将每个文件读入默认图的结果。它是各个图的RDF合并。

        不要被默认图是由FROM子句中的一个或多个url描述的事实所迷惑。这是读取数据的地方,而不是图的名称。由于可以给出几个FROM子句,数据可以从多个地方读入,但它们都不会成为图名。       

        FROM NAMED <url>用于标识一个命名图。图形被命名为url,数据从该位置读取。多个FROM NAMED子句会将多个图形添加到数据集中

        例如,在默认图和命名图中查找所有三元组的查询可以写成:

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc:  <http://purl.org/dc/elements/1.1/>
PREFIX :    <.>

SELECT *
FROM       <ds-dft.ttl>
FROM NAMED <ds-ng-1.ttl>
FROM NAMED <ds-ng-2.ttl>
{
   { ?s ?p ?o } UNION { GRAPH ?g { ?s ?p ?o } }
}

查询结果:

七、更多了解

7.1生产结果集(Producing Result Sets)

SPARQL有四种结果表单:

①SELECT:返回一个结果表。

②CONSTRUCT:根据查询中的模板返回一个RDF图。

③description:根据查询处理器被配置为返回的内容,返回一个RDF图。

④ASK:询问一个布尔查询。

SELECT表单直接返回一个解决方案表作为结果集,而DESCRIBE和CONSTRUCT使用匹配的结果来构建RDF图。

7.2解决方法修饰符(Solution Modifiers)

模式匹配产生一组解决方案。这个集合可以通过多种方式进行修改:

投影-只保留选定的变量

①OFFSET/LIMIT:切割数字解决方案(最好使用ORDER BY)

②ORDER BY:排序结果

③DISTINCT:对于变量和值的一个组合只产生一行。

解决方案修饰符OFFSET/LIMIT和ORDER BY始终应用于所有结果表单。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值