SPARQL查詢語言
SPARQL的查詢是基於結構化知識的,變無序數據為有序知識,讓計算機理解Web信息,即語義Web。現如今,語義網適用於各個領域,包括語義出版、語義知識庫等。SPARQL是針對以RDF框架進行存儲的知識庫進行檢索的SQL語句,因此有一定SQL基礎的話,學習會很容易。
1.概述
2.匹配模式
3.組織結果集
4.查詢方式
5.使用方式
什麽是語義網?
語義網是一種使用可以被計算機理解的方式描述事物的網絡。
- 林俊傑是著名歌手。
- 小酒窩是林俊傑唱的。
- 林俊傑也是演員。
像這樣的句子可以被人類理解。但是如何能夠被計算機理解呢?
陳述是由語法規則構建的。一門語言的語法定義了構建該語言的陳述所需的規則。
這就是語義網的本質所在 - 以計算機應用程序可以理解的方式描述事物。
語義網和網頁之間的鏈接沒有關系。
語義網描述的是事物之間的關系(比方說 A 是 B 的一部分,而 Y 是 Z 的成員)以及事物的屬性(例如尺寸、重量、使用期限和價格等等)。
資源描述框架
RDF(資源描述框架,Resource Description Framework)是一種用於描述網絡上的信息和資源的的標記語言。
將信息至於 RDF 文件之中,這樣的話,這些信息就有可能被計算機程序("web spiders")從網絡中搜索、發現、攝取、篩選、分析和處理。
語義網使用 RDF 來描述網絡資源。
如果希望學習更多關於 RDF 的知識,請參考 http://www.w3school.com.cn/rdf/index.asp 。
1.概述:
當信息被表示為RDF後,出於推理和應用開發的需要,我們需要能夠存取其中的部分。也就是需要叫做SPARQL的語言,它能夠讓我們通過選擇、抽取等方式很容易地從被表示為RDF的知識中獲得特定的部分。SPARQL是專為RDF設計的,適合並依賴於萬維網上的各種技術。
SPARQL基礎設施:
想要執行一條SPARQL查詢,就需要一個能執行查詢的軟件。能做到這一點的最常用的軟件叫做三元組存儲庫。本質上,一個三元組存儲庫就是一個RDF的數據庫。在網上可以下載到很多三元組存儲庫。在SPARQL的相關規範中,三元組存儲庫也稱為圖存儲庫。 在查詢一個三元組存儲庫之前,需要先向其中填充RDF數據。大部分三元組存儲庫都提供批量上傳的選項。也有一種稱為SPARQL更新的機制,提供了一系列向三元組存儲庫中插入、加載及刪除RDF的選項。
2.匹配模式:
2.1簡單的查詢
Data: <http://example.org/book/book1>
<http://purl.org/dc/elements/1.1/title>
"SPARQL Tutorial" .
Query: SELECT ?title WHERE { <http://example.org/book/book1>
<http://purl.org/dc/elements/1.1/title> ?title . }
Result:
Title |
SPARQL Tutorial
|
例如,要在這段數據中做一個查詢。找到這本書的書名。
在SPARQL中,我們可以將三元組中的任何一個元素替換為一個變量。變量的首字符是一個?(問號)。要引入一個變量表示所要查詢的位置。
三元組存儲庫將接收這個圖模式並嘗試去找到能夠匹配這個模式的那些三元組集合。因此找到了主謂一致的三元組。並返回它的賓語。
如這個例子中,Data中有一個三元組,在構建查詢的時候,利用select關鍵詞構造主語和謂語,賓語作為變量返回,系統會根據查詢式構造一個三元組圖模式與RDF庫中的所有三元組進行匹配,將滿足條件的結果返回。
2.2多個匹配
Data: @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name "Johnny Lee Outlaw" . _:a foaf:mbox <mailto:jlow@example.com> . _:b foaf:name "Peter Goodguy" . _:b foaf:mbox <mailto:peter@example.org> . _:c foaf:mbox <mailto:carol@example.org>.
Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox WHERE { ?x foaf:name ?name . ?x foaf:mbox ?mbox }
Result:
與turtle類似,PREFIX關鍵詞指明各種各種URL的縮寫。返回的結果中,每一格表示一個結果。
Data中的_:a _:b _:c是空白節點,沒有具體意義,且字母不固定,只是用來區分不同的實體資源。
2.3條件限制
如果上述的簡單查詢不能滿足查詢需求,則需要對查詢的結果進行一定的條件限制,常用的限制字段主要為:filter、optinal、union。
Filter:限制數字或字符串符合一定要求的結果。數值型數據類型(即整數型、小數)和日期/時間都支持小於、大於和等於運算。
Optional關鍵詞告訴三元組存儲庫為特定的圖模式返回結果——如果能找到。即對於待返回的查詢而言,這個圖模式未必要滿足。
UNION關鍵詞告訴三元組存儲庫返回那些僅匹配一個圖模式或兩個都匹配的結果。
通過例子來進行學習:
Data: @prefix dc:<http://purl.org/dc/elements/1.1/> . @prefix : <http://example.org/book/> . @prefix ns: <http://example.org/ns#> . :book1 dc:title "SPARQL Tutorial" . :book1 ns:price 42 . :book2 dc:title "The Semantic Web" . :book2 ns:price 23 . Query: PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX ns: <http://example.org/ns#> SELECT ?title ?price WHERE { ?x ns:price ?price . FILTER (?price < 30) ?x dc:title ?title . }
可以看到,filter字段通過對price的限制,篩選出了price小於30的所有實體,並返回title和price。
Data: @prefix dc: <http://purl.org/dc/elements/1.1/> . @prefix : <http://example.org/book/> . @prefix ns: <http://example.org/ns#> . :book1 dc:title "SPARQL Tutorial" . :book1 ns:price 42 . :book2 dc:title "The Semantic Web" . :book2 ns:price 23 . Query1: PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?title WHERE { ?x dc:title ?title FILTER regex(?title, "^SPARQL") }
Query2: PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?title WHERE { ?x dc:title ?title FILTER regex(?title, "web", "i" ) }
filter字段不僅可以對數字進行限制,還可以利用正則表達式進行對字符串的限制,filter加上regex,括號中表明變量?title,字符串str,即過濾出變量包含str的實體,str前面加^即表示以str開頭,否則默認為包含有。
Data: @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . _:a rdf:type foaf:Person . _:a foaf:name "Alice" . _:a foaf:mbox <mailto:alice@example.com> . _:a foaf:mbox <mailto:alice@work.example> . _:b rdf:type foaf:Person . _:b foaf:name "Bob" . Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox WHERE { ?x foaf:name ?name . OPTIONAL { ?x foaf:mbox ?mbox } }
Data:
@prefix dc10: <http://purl.org/dc/elements/1.0/> .
@prefix dc11: <http://purl.org/dc/elements/1.1/> .
_:a dc10:title "SPARQL Query Language Tutorial" .
_:a dc10:creator "Alice" .
_:b dc11:title "SPARQL Protocol Tutorial" .
_:b dc11:creator "Bob" .
_:c dc10:title "SPARQL" .
_:c dc11:title "SPARQL (updated)" .
Query:
PREFIX dc10: <http://purl.org/dc/elements/1.0/>
PREFIX dc11: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE { { ?book dc10:title ?title }
UNION { ?book dc11:title ?title }
}
OPTIONAL表示有則返回,沒有則返回空。UNION表示滿足任一即返回,相當於布爾邏輯中的OR。
3.組織結果集:
我們想要查詢結果以一種特定的方式返回:分組的、計數的或排序的。SPARQL支持一些函數來幫助我們組織結果集。
Order: put the solutions in order
Distinct: ensure solutions in the sequence are unique
Reduced: permit elimination of some non-unique solutions
Offset: control where the solutions start from in the overall sequence of solutions
Limit: restrict the number of solutions
在更大的數據集上,我們可能不知道有多少條結果,或者我們的查詢會不會返回整個數據集。因此,一個好的做法就是限制一條查詢能返回的答案的數量。就是LIMIT關鍵詞。
Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?x foaf:name ?name } LIMIT 20 //限制返回結果為20條
如果不使用DISTINCT/REDUCED關鍵詞,結果集中會出現重復的結果。
Data: @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:x foaf:name "Alice" . _:x foaf:mbox <mailto:alice@example.com> . _:y foaf:name "Alice" . _:y foaf:mbox <mailto:asmith@example.com> . _:z foaf:name "Alice" . _:z foaf:mbox <mailto:alice.smith@example.com> . Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?x foaf:name ?name }
Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT DISTINCT ?name WHERE { ?x foaf:name ?name }
DISTINCT關鍵字,可以保證結果唯一,REDUCED會對重復的結果進行適當的減少,不同的情況用不同的限制。
在SPARQL中,使用ORDER BY關鍵詞來對返回的結果集排序。例如,按公寓所含臥室數量進行排序。
DESC關鍵詞指明了按降序排列。ASC指的是升序。
此外,字符串得排序是根據字典序。
OFFSET和LIMIT關鍵詞一起使用來選取不同的結果子集。 (前提是排序) PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?x foaf:name ?name } ORDER BY ?name LIMIT 1 OFFSET 5 //表示對排序後的結果剔除前五個,返回一個,即第六個。
4.查詢方式:
SPARQL有四種查詢形式。
SELECT:在查詢匹配模式中,返回所有的,或者部分子集。
CONSTRUCT:通過取代三元組中的變量,返回一個新RDF圖模式。
ASK:返回一個布爾值,顯示是否有匹配項。
DESCRIBE:返回一個表述資源的RDF圖模式。
5.使用方式:
sparql的使用方式主要為兩種,一種是網頁知識庫提供的查詢端口,例如wikidata中提供的query service,在不同的知識庫中有不同的詞表屬性,對不同的實體和屬性有不同的ID號,需要另外學習,但是基本的語法基本一樣,看幾個例子便可以使用;第二種是利用Jena包編寫代碼進行自定義查詢,當然還有很多工具平臺也提供了sparql端口,例如D2RQ,但是它的底層實現也是基於Jena實現對於RDF的解析和可視化。
在一月份,我會把使用D2RQ和Jena解析的詳細步驟進行記錄和介紹。
SPARQL查詢語言