通過例句介紹Sparql的使用
1 簡介
SPARQL的定義,是一個遞歸的定義,為SPARQL Protocal and RDF Query Language,是W3C制定的RDF知識圖譜標准查詢語言,大部分的圖數據庫都支持SPARQL查詢。SPARQL在語法上借鑒了SQL。SPARQL是針對RDF三元組進行查詢,通過圖匹配的方式獲得需要查找的內容。
下面通過一個例子來說明SPARQL的查詢語句的基本結構。這個例子可以在http://dbpedia.org/sparql中運行,獲取結果。
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
from <http://dbpedia.org>
where {ontology:deathDate ?p ?o}
LIMIT 10
查詢例句,包括了5個部分。
第一部分是前綴聲明,這部分主要是為了后面查詢內容的簡潔,本例中用ontology代替http://dbpedia.org/ontology/,在后面的查詢中直接使用ontology,比如ontology:deathDate就表示http://dbpedia.org/ontology/deathDate,
第二部分是select子句,用來確定需要查找的內容。以變量的形式體現,本例中就是查找?p和?o,按照三元組的主謂賓結構,這里查找的是謂語和賓語,分別用帶問號的字符(串)來表示。
第三部分是from子句,用來確定從哪個圖數據庫中查找,類似於關系數據庫的表名。本例需要查找的數據是在圖數據庫http://dbpedia.org中進行查找。也可以把http://dbpedia.org這個Graph IRI放到第一個方框內,作為默認的數據集名稱。
第四部分是where子句,這部分是用來匹配三元組,把需要匹配的內容放到{}中,本例中,ontology:deathDate ?p ?o的含義就是主語是ontology:deathDate,即http://dbpedia.org/ontology/deathDate,謂語是?p,賓語是?o,匹配這個內容結構的所有三元組,也就是找出主語是http://dbpedia.org/ontology/deathDate的所有三元組。
第五部分是查詢修正的內容,類似於關系數據查詢最后的一些限定子句,比如排序order by,限定前幾個輸出的limit等。本例就是用的limit 10,限定只輸出10個結果。
查詢結果如下
p |
o |
http://www.w3.org/1999/02/22-rdf-syntax-ns#type |
http://www.w3.org/2002/07/owl#FunctionalProperty |
http://www.w3.org/1999/02/22-rdf-syntax-ns#type |
http://www.w3.org/1999/02/22-rdf-syntax-ns#Property |
http://www.w3.org/1999/02/22-rdf-syntax-ns#type |
http://www.w3.org/2002/07/owl#DatatypeProperty |
http://www.w3.org/2002/07/owl#equivalentProperty |
http://www.wikidata.org/entity/P570 |
http://www.w3.org/2002/07/owl#equivalentProperty |
http://schema.org/deathDate |
http://www.w3.org/2000/01/rdf-schema#label |
"Sterbedatum"@de |
http://www.w3.org/2000/01/rdf-schema#label |
"date de décès"@fr |
http://www.w3.org/2000/01/rdf-schema#label |
"death date"@en |
http://www.w3.org/2000/01/rdf-schema#label |
"sterfdatum"@nl |
http://www.w3.org/2000/01/rdf-schema#label |
"ημερομηνία_θανάτου"@el |
2 一些常用的查詢語句
2.1 最簡單的查詢
就像SQL語句中的查詢所有內容select * from table,SPARQL也有一個查詢全部數據的語句,也是最簡單的語句。
select ?s ?p ?o where {?o ?p ?o}
這個語句可以查看圖數據庫里面的所有三元組,不過如果數據集比較龐大,可能發生延時錯誤,也就是在一定的時間內查詢不能完成導致最后無法完成查詢,從而不能提供查詢結果。
2.2 聚合函數
在SPARQL中,也有類似SQL中的聚合函數,比如count,比較常用的一個就是查詢圖數據庫的三元組數量。
select count(?s) where {?o ?p ?o}
我們用上面的語句查詢http://dbpedia.org中三元組的數量,我查了幾次,有幾次是給出延時錯誤,有的時候能給出結果。
callret-0 |
316290000 |
可以看到,http://dbpedia.org這個圖數據庫一共有3億多條數據。
2.3 opional過濾
使用optional,可以起到過濾的作用,如果滿足optional后面匹配的條件,則結果顯示出來。比如下面的語句
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
where {{?s ?p <http://schema.org/deathDate>} optional {?s <http://www.w3.org/2000/01/rdf-schema#label> ?o}}
查詢的含義是先查找賓語是http://schema.org/deathDate 的主語?s和謂語?p,將主語?s滿足模式?s <http://www.w3.org/2000/01/rdf-schema#label> ?o的內容找出來,最后顯示出兩個條件都滿足的結果,也可以理解為,通過optional后面的子句過濾掉一部分第一個子句的結果,得到最終的結果。
p |
o |
http://www.w3.org/2002/07/owl#equivalentProperty |
Sterbedatum@de |
http://www.w3.org/2002/07/owl#equivalentProperty |
date de décès@fr |
http://www.w3.org/2002/07/owl#equivalentProperty |
death date@en |
http://www.w3.org/2002/07/owl#equivalentProperty |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
|
http://www.w3.org/2002/07/owl#equivalentProperty |
resting date@en |
http://www.w3.org/2002/07/owl#equivalentProperty |
2.4 union全集
union也是一個在SPARQL中常用的關鍵字,使用union表示,將所有union連接的子句匹配的結果都顯示出來。我們還用2.3的例子,不過把optional替換為union,可以比較一下二者的不同。
查詢語句為
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
where {{?s ?p <http://schema.org/deathDate>} union {?s <http://www.w3.org/2000/01/rdf-schema#label> ?o}}
查詢結果為(部分結果)
從結果可以看出,optional和union的差別還是很明顯的,optional是過濾,union是全集,是並的操作。
2.5 模糊查詢
在SQL中的like查詢,在SPARQL中也有對應的語句,就是使用FILTER 和regex。
例句為
prefix ontology:<http://dbpedia.org/ontology/>
select distinct ?p ?o
where {ontology:deathDate ?p ?o filter regex(?p,'label')}
還是查找主語deathDate這個主語的謂語和賓語列表,模糊查詢的是謂語中含有’label’的謂語和賓語,這個filter和regex的組合實現的功能就是類似SQL的like功能。
查詢結果為
p |
o |
http://www.w3.org/2000/01/rdf-schema#label |
Sterbedatum@de |
http://www.w3.org/2000/01/rdf-schema#label |
date de décès@fr |
http://www.w3.org/2000/01/rdf-schema#label |
death date@en |
http://www.w3.org/2000/01/rdf-schema#label |
sterfdatum@nl |
http://www.w3.org/2000/01/rdf-schema#label |
ημερομηνία_θανάτου@el |
http://www.w3.org/2000/01/rdf-schema#label |
沒年月日@ja |
從結果可以看到,模糊查詢中謂語只包含了有label的內容,其它的給過濾掉了。
3 結語
這里只是簡單介紹了SPARQL的語法和常用的查詢語句,實際環境中,應用SPARQL進行查詢可能會復雜的多,會有很多復合語句,更為復雜的可能會跨數據集進行查詢,也可能用到RDF的一些特性,比如只查找字面量或者只查找IRI的數據等等。總之,SPARQL查詢,在實際的使用中,會碰到各種不同的需求,還要根據具體情況寫出各種查詢語句。
書寫SPARQL查詢語句的時候,還要細心,不能出錯,不能寫錯一個字符,有的時候還要注意順序,這些問題沒有注意到,都可能導致查不到結果,或者是直接報錯。在拼接SPARQL的時候,要多一些耐心,按照SPARQL規則來,循序漸進,慢慢就會初步掌握這種查詢語言。
另外SPARQL還有UPDATE功能,有insert和delete關鍵字,但是沒有update關鍵字,也就是說,SPARQL如果實現update操作,需要先insert再delete,從而達到update的效果。SPARQL的UPDATE功能,不如查詢功能用的廣泛,可能是因為數據集一般數據量大,都是直接以文件的形式存到數據庫中的緣故。
本文通過例句的形式,介紹了SPARQL的基礎知識,希望對大家學習sparql有幫助,在學習過程中,有什么問題,還是要多交流,共同進步。
參考資料