SPARQL查询RDF文件-2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangfengling1023/article/details/82665480

1、查询语句包括查询信息以及名称应该符合的条件,条件以三元组形式出现,按照<subject,predicate,object>(主谓宾)的顺序排列,查询条件也成为一个模式(Pattern),查询的结果实际就是条件三元组与数据文件(或RDF图)中RDF三元组匹配的结果

2、语句中的?加一个字母表示该字母是一个变量,比如?x,在select后面的变量会显示在查询结果中,作为列名称出现

3、实际上,做到这一步之后,所有的事情只是修改模式,给模式添加一些条件了

rdf的内容:

<?xml version="1.0"?>
<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#">
  <rdf:Description rdf:about="http://somewhere/MattJones/">
    <vCard:FN>Matt Jones</vCard:FN>
      <vCard:N rdf:parseType="Resource">
        <vCard:Family>Jones</vCard:Family>
        <vCard:Given>Matthew</vCard:Given>
      </vCard:N>
  </rdf:Description>
  <rdf:Description rdf:about="http://somewhere/RebeccaSmith/">
    <vCard:FN>Becky Smith</vCard:FN>
    <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/JohnSmith/">
    <vCard:FN>John Smith</vCard:FN>
    <vCard:N rdf:parseType="Resource">
      <vCard:Family>Smith</vCard:Family>
      <vCard:Given>Jones</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:RDF>

解析过后的结果如下所示:

例子1:

select ?x ?fname
where {?x  <http://www.w3.org/2001/vcard-rdf/3.0#FN>  ?fname}

查询结果如下所示:

两个变量的位置在主语、宾语的位置,所以将所有符合条件的都返回回来,由解析出的RDF文件可以看出总共有4个符合查询条件

需要注意一下:“?x ?fname”之间是空格,不是逗号。如果有多个模式三元组,那么三元组之间用点号“.”隔开

例子2:

SELECT ?givenName
WHERE 
{ ?y  <http://www.w3.org/2001/vcard-rdf/3.0#Family>  "Smith" .

  ?y  <http://www.w3.org/2001/vcard-rdf/3.0#Given>  ?givenName .}

查询结果如下所示:

命名空间的简写替代:这时候,模式中的谓词的URI都带一个长长的命名空间字符串,

“http://www.w3.org/2001/vcard-rdf/3.0#”,

能用一个简单的单词代替它应该会比较简单。实现简写URI的的语法是这样的:

PREFIX vcard:<http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?givenName
WHERE
{ ?y vcard:Family "Smith" .
  ?y vcard:Given  ?givenName .}

查询结果如下所示:

 语句PREFIX vcard:<http://www.w3.org/2001/vcard-rdf/3.0#> 定义了一个前缀单词vcard,在查询语句中,它与后面的命名空间等价。

例子3:

过滤查询结果:

 在查询语句中添加过滤条件的语句是

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

FILTER是声明过滤,?x是过滤模式作用的变量,后面的pattern是具体的限制条件,比如

PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?g
WHERE
{ ?y vcard:Given ?g .
FILTER regex(?g, "r", "i") }

查询结果如下所示:

这是要查询一些名字(Given Name),”r”表示,名字中必须出现的字母”r”或者”R”;”i”表示,对签名的字母限制,默认不加对大小写敏感,加上则对大小写不敏感

例子4:可选查询信息

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#'
   >

  <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>

解析出的结果如下所示:

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 }

}

运行结果如下所示:

在一些查询中,一些需要返回的数据可能不存在,而这些不存在的数据所在的数据元素中有其他需要返回的信息,这时候就可以通过可选查询信息进行查询

在上面的例子中,需要查询一些名字和年龄,其中有两个人是没有年龄信息的,但在查询语句中有OPTIONAL,表示年龄信息是可选,即使所查询出的信息中没有年龄信息也将该信息进行返回操作。

若将关键OPTIONAL字去掉:

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

}

则查询结果如下所示:

上面的查询结果显示,当年龄这个信息不存在时,不会将相关的信息进行返回

 

例子5:在可选查询的基础之上加上过滤条件

rdf文件和例子4的保持一致

查询语句:

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 ) }

}

查询结果如下所示:

我们先进行可选查询,在可选查询的基础之上对年龄信息进行筛选,当年龄大于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 )

}

查询结果如下所示:

语句 !bound(?age) || ?age > 24  的意思是,没有(未绑定)age或者age大于24。所以,年龄小于24的"Becky Smith"就不会出现在这个查询的结果中了。

上面的代码也可以理解成若年龄含有具体的值,则这个值必须大于24才会返回,若无年龄这个信息,也进行返回

 

例子6

后续再进行更新

 

 

猜你喜欢

转载自blog.csdn.net/yangfengling1023/article/details/82665480
今日推荐