使用 SPARQL 查询 RDF

来源:互联网 发布:mac版梦幻西游更新失败 编辑:程序博客网 时间:2024/04/27 06:01

ARQ 是 Jena 用以支持 SPARQL 的 查询引擎。本文将通过使用 ARQ 进行实际的 SPARQL 查询操作,来对 SPARQL 进行介绍。

数据源

在使用 ARQ 之前,让我们先来介绍一下我们所使用的RDF 数据源。数据的结构如下图所示。

该模型保存为一个 RDF 文件。

vc-db-1.rdf

[html] view plaincopy
  1. <rdf:RDF  
  2.   xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'  
  3.   xmlns:vCard='http://www.w3.org/2001/vcard-rdf/3.0#'  
  4.    >  
  5.   
  6.   <rdf:Description rdf:about="http://somewhere/JohnSmith/">  
  7.     <vCard:FN>John Smith</vCard:FN>  
  8.     <vCard:N rdf:parseType="Resource">  
  9.     <vCard:Family>Smith</vCard:Family>  
  10.     <vCard:Given>John</vCard:Given>  
  11.     </vCard:N>  
  12.   </rdf:Description>  
  13.   
  14.   <rdf:Description rdf:about="http://somewhere/RebeccaSmith/">  
  15.     <vCard:FN>Becky Smith</vCard:FN>  
  16.     <vCard:N rdf:parseType="Resource">  
  17.     <vCard:Family>Smith</vCard:Family>  
  18.     <vCard:Given>Rebecca</vCard:Given>  
  19.     </vCard:N>  
  20.   </rdf:Description>  
  21.   
  22.   <rdf:Description rdf:about="http://somewhere/SarahJones/">  
  23.     <vCard:FN>Sarah Jones</vCard:FN>  
  24.     <vCard:N rdf:parseType="Resource">  
  25.     <vCard:Family>Jones</vCard:Family>  
  26.     <vCard:Given>Sarah</vCard:Given>  
  27.     </vCard:N>  
  28.   </rdf:Description>  
  29.   
  30.   <rdf:Description rdf:about="http://somewhere/MattJones/">  
  31.     <vCard:FN>Matt Jones</vCard:FN>  
  32.     <vCard:N  
  33.     vCard:Family="Jones"  
  34.     vCard:Given="Matthew"/>  
  35.   </rdf:Description>  
  36.   
  37. </rdf:RDF>  


用三元组的形式表示为:

[plain] view plaincopy
  1. @prefix vCard:   <http://www.w3.org/2001/vcard-rdf/3.0#> .  
  2. @prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  
  3. @prefix :        <#> .  
  4.   
  5. <http://somewhere/MattJones/>  
  6.     vCard:FN    "Matt Jones" ;  
  7.     vCard:N     [ vCard:Family  
  8.                               "Jones" ;  
  9.                   vCard:Given  
  10.                               "Matthew"  
  11.                 ] .  
  12.   
  13. <http://somewhere/RebeccaSmith/>  
  14.     vCard:FN    "Becky Smith" ;  
  15.     vCard:N     [ vCard:Family  
  16.                               "Smith" ;  
  17.                   vCard:Given  
  18.                               "Rebecca"  
  19.                 ] .  
  20.   
  21. <http://somewhere/JohnSmith/>  
  22.     vCard:FN    "John Smith" ;  
  23.     vCard:N     [ vCard:Family  
  24.                               "Smith" ;  
  25.                   vCard:Given  
  26.                               "John"  
  27.                 ] .  
  28.   
  29. <http://somewhere/SarahJones/>  
  30.     vCard:FN    "Sarah Jones" ;  
  31.     vCard:N     [ vCard:Family  
  32.                               "Jones" ;  
  33.                   vCard:Given  
  34.                               "Sarah"  
  35.                 ] .  


也可以这样表示:

[plain] view plaincopy
  1. @prefix vCard:   <http://www.w3.org/2001/vcard-rdf/3.0#> .  
  2. @prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  
  3.   
  4. <http://somewhere/MattJones/>  vCard:FN   "Matt Jones" .  
  5. <http://somewhere/MattJones/>  vCard:N    _:b0 .  
  6. _:b0  vCard:Family "Jones" .  
  7. _:b0  vCard:Given  "Matthew" .  
  8.   
  9. <http://somewhere/RebeccaSmith/> vCard:FN    "Becky Smith" .  
  10. <http://somewhere/RebeccaSmith/> vCard:N     _:b1 .  
  11. _:b1 vCard:Family "Smith" .  
  12. _:b1 vCard:Given  "Rebecca" .  
  13.   
  14. <http://somewhere/JohnSmith/>    vCard:FN    "John Smith" .  
  15. <http://somewhere/JohnSmith/>    vCard:N     _:b2 .  
  16. _:b2 vCard:Family "Smith" .  
  17. _:b2 vCard:Given  "John"  .  
  18.   
  19. <http://somewhere/SarahJones/>   vCard:FN    "Sarah Jones" .  
  20. <http://somewhere/SarahJones/>   vCard:N     _:b3 .  
  21. _:b3 vCard:Family  "Jones" .  
  22. _:b3 vCard:Given   "Sarah" .  


ARQ ---- Jena 的 SPARQL 工具

在我们下载得到的Jena 包的bat 或 bin 目录下,具有文件 sparql.bat 或 sparql 。我们可以使用它们进行 SPARQL 查询操作。

我们所使用的查询文件为:

q1.rq

[plain] view plaincopy
  1. SELECT ?x  
  2. WHERE { ?x  <http://www.w3.org/2001/vcard-rdf/3.0#FN>  "John Smith" }  

在执行操作之前,首先需要设置 JENAROOT 环境变量。将其设置为Jena 包解压后的位置。然后就可以执行查询操作了。如下图所示:

可以看出,我们首先将 JENAROOT 设置为 D:\Workspaces\JenaDemo\apache-jena-2.7.4,这是 Jena 包的位置。

然后执行 bat\sparql.bat --data=vc-db-1.rdf --query=q1.rq。可以看出查询得到一个结果,x 为 <http://somewhere/JohnSmith>。

 

 Solution ---- 查询结果

Query Solutions 是查询所得到的一些“变量/值”对的集合。

 看下面这个查询:

[plain] view plaincopy
  1. SELECT ?x ?fname  
  2. WHERE {?x  <http://www.w3.org/2001/vcard-rdf/3.0#FN>  ?fname}  

它的结果为:

[plain] view plaincopy
  1. ----------------------------------------------------  
  2. | x                                | name          |  
  3. ====================================================  
  4. | <http://somewhere/RebeccaSmith/> | "Becky Smith" |  
  5. | <http://somewhere/SarahJones/>   | "Sarah Jones" |  
  6. | <http://somewhere/JohnSmith/>    | "John Smith"  |  
  7. | <http://somewhere/MattJones/>    | "Matt Jones"  |  
  8. ----------------------------------------------------  

得到了 4 个solution。

基本模式(Basic Pattern)

基本模式时一些三元组模式(Triple Patterns)的集合。如下 SPARQL 语句:

[plain] view plaincopy
  1. SELECT ?givenName  
  2. WHERE  
  3.   { ?y  <http://www.w3.org/2001/vcard-rdf/3.0#Family>  "Smith" .  
  4.     ?y  <http://www.w3.org/2001/vcard-rdf/3.0#Given>  ?givenName .  
  5.   }  

仅当一次查询中所有的三元组都与同一个值 match 的时候,我们才说它同这个值 match。如这个 SPARQL 语句查询所得到的结果为:

[plain] view plaincopy
  1. -------------  
  2. | givenName |  
  3. =============  
  4. | "John"    |  
  5. | "Rebecca" |  
  6. -------------  
  • 前缀机制

看这个例子

[plain] view plaincopy
  1. PREFIX vcard:      <http://www.w3.org/2001/vcard-rdf/3.0#>  
  2.   
  3. SELECT ?givenName  
  4. WHERE  
  5.  { ?y vcard:Family "Smith" .  
  6.    ?y vcard:Given  ?givenName .  
  7.  }  


  • 空节点

[plain] view plaincopy
  1. PREFIX vcard:      <http://www.w3.org/2001/vcard-rdf/3.0#>  
  2.   
  3. SELECT ?y ?givenName  
  4. WHERE  
  5.  { ?y vcard:Family "Smith" .  
  6.    ?y vcard:Given  ?givenName .  
  7.  }  

查询得到的结果为:

[plain] view plaincopy
  1. --------------------  
  2. | y    | givenName |  
  3. ====================  
  4. | _:b0 | "John"    |  
  5. | _:b1 | "Rebecca" |  
  6. --------------------  

以 "_:" 开头的QName 并不是空节点的内部表示,它们仅仅是 ARQ 所打印出来的一个标记而已。

字符串匹配

语法为:

[plain] view plaincopy
  1. FILTER regex(?x, "pattern" [, "flags"])  

其中 flags 如果是 "i" ,就代表忽略大小写。看下面这个例子

[plain] view plaincopy
  1. PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>  
  2.   
  3. SELECT ?g  
  4. WHERE  
  5. { ?y vcard:Given ?g .  
  6.   FILTER regex(?g, "r", "i") }  

它将查询名字中包含 "R" 或 "r" 的项。


值匹配

[plain] view plaincopy
  1. PREFIX info: <http://somewhere/peopleInfo#>  
  2.   
  3. SELECT ?resource  
  4. WHERE  
  5.   {  
  6.     ?resource info:age ?age .  
  7.     FILTER (?age >= 24)  
  8.   }  


其中 age 的类型为 integer。如下例中 "^^xsd:integer" 所表示的:

[plain] view plaincopy
  1. <http://somewhere/RebeccaSmith/>  
  2.     info:age "23"^^xsd:integer ;  
  3.     vCard:FN "Becky Smith" ;  
  4.     vCard:N [ vCard:Family "Smith" ;  
  5.               vCard:Given  "Rebecca" ] .  


可选项

OPTIONAL 使得当某一项不存在时查询不至于失败。

如下查询获取 name 和 age(仅当age 存在时才获取,弱age 不存在只获取name)。

[plain] view plaincopy
  1. PREFIX info:    <http://somewhere/peopleInfo#>  
  2. PREFIX vcard:   <http://www.w3.org/2001/vcard-rdf/3.0#>  
  3.   
  4. SELECT ?name ?age  
  5. WHERE  
  6. {  
  7.     ?person vcard:FN  ?name .  
  8.     OPTIONAL { ?person info:age ?age }  
  9. }  

查询结果为:

[plain] view plaincopy
  1. ------------------------  
  2. | name          | age |  
  3. =======================  
  4. | "Becky Smith" | 23  |  
  5. | "Sarah Jones" |     |  
  6. | "John Smith"  | 25  |  
  7. | "Matt Jones"  |     |  
  8. -----------------------  


UNION

对以下数据:

[plain] view plaincopy
  1. @prefix foaf: <http://xmlns.com/foaf/0.1/> .  
  2. @prefix vcard: <http://www.w3.org/2001/vcard-rdf/3.0#> .  
  3.   
  4. _:a foaf:name   "Matt Jones" .  
  5.   
  6. _:b foaf:name   "Sarah Jones" .  
  7.   
  8. _:c vcard:FN    "Becky Smith" .  
  9.   
  10. _:d vcard:FN    "John Smith" .  

查询

[plain] view plaincopy
  1. PREFIX foaf: <http://xmlns.com/foaf/0.1/>  
  2. PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>  
  3.   
  4. SELECT ?name  
  5. WHERE  
  6. {  
  7.    { [] foaf:name ?name } UNION { [] vCard:FN ?name }  
  8. }  

所得到的结果为:

[plain] view plaincopy
  1. -----------------  
  2. | name          |  
  3. =================  
  4. | "Matt Jones"  |  
  5. | "Sarah Jones" |  
  6. | "Becky Smith" |  
  7. | "John Smith"  |  
  8. -----------------  

而如果分别用 name1 和name2,则

[plain] view plaincopy
  1. PREFIX foaf: <http://xmlns.com/foaf/0.1/>  
  2. PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>  
  3.   
  4. SELECT ?name1 ?name2  
  5. WHERE  
  6. {  
  7.    { [] foaf:name ?name1 } UNION { [] vCard:FN ?name2 }  
  8. }  
  9.   
  10. ---------------------------------  
  11. | name1         | name2         |  
  12. =================================  
  13. | "Matt Jones"  |               |  
  14. | "Sarah Jones" |               |  
  15. |               | "Becky Smith" |  
  16. |               | "John Smith"  |  
  17. ---------------------------------  
0 0
原创粉丝点击