Sparql查询RDF

Posted IT丶小农民

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sparql查询RDF相关的知识,希望对你有一定的参考价值。

SparQL(Simple Protocol and RDF Query Language),是为RDF开发的一种查询语言和数据获取协议,它是为W3C所开发的RDF数据模型所定义,但是可以用于任何可以用RDF来表示的信息资源。
ARQ(Automatic Repeat Request)是jena用来支持SparQL的查询引擎,这里我们来介绍下使用ARQ进行实际的SparQL操作。


数据源:
在我们使用ARQ之前,我们先来介绍下使用的RDF数据源,数据源结构如下图所示。
技术分享
这个本体模型我们保存为一个RDF文件。
data.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#‘
   >

  <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>John</vCard:Given>
    </vCard:N>
  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/RebeccaSmith/">
    <vCard:FN>RebeccaSmith</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/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>

使用三元组形式表示如下:

model.write(System.out,"N-TRIPLE")
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffc <http://www.w3.org/2001/vcard-rdf/3.0#Given> "Matthew" .
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffc <http://www.w3.org/2001/vcard-rdf/3.0#Family> "Jones" .
<http://somewhere/RebeccaSmith/> <http://www.w3.org/2001/vcard-rdf/3.0#N> _:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffe .
<http://somewhere/RebeccaSmith/> <http://www.w3.org/2001/vcard-rdf/3.0#FN> "RebeccaSmith" .
<http://somewhere/SarahJones/> <http://www.w3.org/2001/vcard-rdf/3.0#N> _:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffd .
<http://somewhere/SarahJones/> <http://www.w3.org/2001/vcard-rdf/3.0#FN> "Sarah Jones" .
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7fff <http://www.w3.org/2001/vcard-rdf/3.0#Given> "John" .
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7fff <http://www.w3.org/2001/vcard-rdf/3.0#Family> "Smith" .
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffd <http://www.w3.org/2001/vcard-rdf/3.0#Given> "Sarah" .
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffd <http://www.w3.org/2001/vcard-rdf/3.0#Family> "Jones" .
<http://somewhere/JohnSmith/> <http://www.w3.org/2001/vcard-rdf/3.0#N> _:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7fff .
<http://somewhere/JohnSmith/> <http://www.w3.org/2001/vcard-rdf/3.0#FN> "John Smith" .
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffe <http://www.w3.org/2001/vcard-rdf/3.0#Given> "Rebecca" .
_:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffe <http://www.w3.org/2001/vcard-rdf/3.0#Family> "Smith" .
<http://somewhere/MattJones/> <http://www.w3.org/2001/vcard-rdf/3.0#N> _:Ad537bf7X3aX153cfcf2ec7X3aXX2dX7ffc .
<http://somewhere/MattJones/> <http://www.w3.org/2001/vcard-rdf/3.0#FN> "Matt Jones" .

这里我们需要首先配置环境变量,跟JDK一样,把我们的下载的apache-jena-3.0.0加压到指定目录,我的是C:\Program Files\apache-jena-3.0.0
具体环境变量配置如下图:
①classpath配置
技术分享
②path配置
技术分享
③jenaroot配置
技术分享
配置结束之后,我们打开终端cmd,输入sparql之后效果如下图:如果出现No query string or query file表示你已经配置成功,接下来我们可以通过终端做查询操作了。
技术分享
现在我们来通过sparql查询我们的data.rdf文本看看效果。
技术分享
在这里我们可以看到直接执行查询的话,提示找不到sparql.rq文本,这是我们需要进入文件所在目录即可或者写文本所在全路径也可以(这里就不再具体操作了)。
我们可以看到我们查询的结果。sparql语句如下:

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

现在我们改下

SELECT ?x  WHERE { ?x  <http\://www.w3.org/2001/vcard-rdf/3.0\#FN>  "John Smith" } 

技术分享

因为终端操作很麻烦,我还是喜欢写代码,接下来我通过java代码来做具体的查询吧。
现在我们把sparql内容更改如下:

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

ResultSetFormatter.out(System.out, results, query) ;//格式化输出到控制台
这里我们得到了四个Resource和对应的fname。

-----------------------------------------------------
| x                                | fname          |
=====================================================
| <http://somewhere/MattJones/>    | "Matt Jones"   |
| <http://somewhere/SarahJones/>   | "Sarah Jones"  |
| <http://somewhere/RebeccaSmith/> | "RebeccaSmith" |
| <http://somewhere/JohnSmith/>    | "John Smith"   |
-----------------------------------------------------

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

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

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

-------------
| givenName |
=============
| "Rebecca" |
| "John"    |
-------------

前缀机制:
sparql内容如下:

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

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

查询的结果如下:

--------------------
| y    | givenName |
====================
| _:b0 | "Rebecca" |
| _:b1 | "John"    |
--------------------

以 “_:” 开头的QName 并不是空节点的内部表示,它们仅仅是 ARQ 所打印出来的一个标记而已。
字符串匹配
语法为:

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

其中 flags 如果是 “i” ,就代表忽略大小写。

sparql内容如下:它将查询名字中包含 “R” 或 “r” 的项。

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

SELECT ?g  
WHERE  
{ ?y vcard:Given ?g .  
  FILTER regex(?g, "r", "i") }  

查询结果如下:

-------------
| g         |
=============
| "Sarah"   |
| "Rebecca" |
-------------

今天暂时写到这里,后续会继续学习和分享。

























以上是关于Sparql查询RDF的主要内容,如果未能解决你的问题,请参考以下文章

SPARQL查询语言

java 使用Apache Jena的API(不是RESTful API)从RDF数据构建数据库并回答Java中的SPARQL查询

SPARQL 联合查询不返回所有解决方案

Sparql语言模型

其他RDF与SPARQL

其他RDF与SPARQL