一個SPARQL語句的說明

SPARQL,和“sparkle”的發音一樣,它是一種 RDF 查詢語言,可以從 RDF 圖中查詢信息。在 W3C Technical Reports and Publications 頁面上,我們可以看到,現在和 SPARQL 相關的共有三項內容:其中兩個是 Candidate Recommendations(候選推薦),SPARQL Protocol for RDF 和 SPARQL Query Results XML Format;另外一個是 Word Drafts(工作草案),SPARQL Query Language for RDF。上了這個頁面,基本上就已經說明這個要成爲 W3C 的推薦標準了,就像 RDF 和 OWL 一樣。而且,在 WWW2006 發言時,TimBL 也已經表示,隨着 SPARQL 查詢語言即將完成標準化,語義網已經具備了成功所需要的所有標準和技術,Web開發人員和內容創作人員可以開始使用這些語義語言了。http://www.w3.org/2001/11/... 上有一個比較完整的列表。SPARQL 是基於以前的 RDF 查詢語言(如rdfDB、RDQL 和 SeRQL)發展而來的,擁有一些有價值的新特性,並且受到 Jena 開發團隊的鼎立支持。Jena 是 HP 公司語義網研究小組開發的一套 Java 工具包,用來支持人們進行語義網的相關研究和應用開發。SPARQL 的語法細節這裏就不一一列舉了,直接給出一個例子。總體來說,SPARQL 的語法和傳統 SQL 的語法還是有幾分相似的,大家應該不會陌生。

 

BASE <http://my.donews.com/>

 

PREFIX rdf: <">http://www.w3.org/1999/02/...

PREFIX foaf: <http://xmlns.com/foaf/0.1/...

# 這是一個以 BASE 爲根的相對 IRI

PREFIX user: <users#>

SELECT ?person ?name ?age

FROM <users.rdf>

WHERE {

?person a foaf:Person ;

foaf:name ?name .

OPTIONAL { ?person user:age ?age } .

FILTER (REGEX(?name, “clickstone”))

}

ORDER BY ASC(?name)

LIMIT 10

OFFSET 10

 

簡要的說明一下例子中出現的語法。

  1. BASE,根 IRI,其他以此爲根的 IRI 就可以寫成相對形式了,見例子裏面的註釋。一旦定義了 BASE,就可以在 SPARQL 的任何地方進行使用了,例子中共用到了 2 處。
  2. 使用 # 進行註釋。
  3. PREFIX,IRI 前綴的縮寫。
  4. SELECT,查詢關鍵字,和 SQL 中的一個意思。
  5. ?person ?name ?age,要查詢的變量,使用 ? 標識變量,也可以使用 $。變量間使用空白分隔(現在正在徵集意見,正式標準中使用空白還是逗號分隔尚未最終確定)。
  6. FROM,從何處查詢數據。可以一次查詢多個 RDF 數據集,只需要使用 FROM 逐一列出即可。
  7. WHERE,過濾條件集合,和 SQL 的 WHERE 一個意思。
  8. ?person a foaf:Person,具體的過濾條件,使用 Turtle 語法。還記得“a”是什麼意思嗎?具體的介紹可以參看《RDF 實戰》。
  9. 例子中兩個過濾條件的主語都是“?person”,因此,使用了簡寫的形式。如果主語不同,逐一列出檢索條件即可。
  10. OPTIONAL,可選過濾條件。比如有些 ?person 可能沒有填寫 age 屬性,如果不使用 OPTIONAL,那麼查詢結果將不包含這些 ?person;使用了 OPTIONAL 關鍵字,沒有填寫 age 屬性的 ?person,同樣可以被查詢到。
  11. FILTER (REGEX(?name, “clickstone”)),明確化的過濾條件,類似於 SQL 中的 LIKE、=、> 等的左右。例子中的意思是說,返回的 ?name 變量中,必須包含“clickstone”。
  12. ORDER BY,排序,可以指定多個排序,比如例子可以改爲,ORDER BY ASC(?name) DESC(?age)。默認排序是 ASC。
  13. LIMIT 10,將返回結果限定在 10 條,類似於 SQL 中的 SELECT TOP 10。
  14. OFFSET 10,掠過前邊的 10 條,從 第 11 條開始返回。這個功能比 SQL 強大,SQL 要自己寫翻頁。

 

其他的還有 UNION、DISTINCT 等的使用,大家就自己看文檔吧。但必須強調一點,SPARQL 的使用中和 SQL 一個非常大的區別,需要大家注意:SELECT 子句中出現的變量,比如例子中的 ?person ?name ?age,在 WHERE 子句中必須全部出現。爲什麼會這樣呢?因爲對於一個 SPARQL 查詢處理器來講,它不具備類似於關係數據庫中數據字典的東西以供參考,所以每一個 SELECT 的變量,在 WHERE 中必須指定一個用來匹配的triple。

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