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配置
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" |
-------------

今天暫時寫到這裏,後續會繼續學習和分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章