知識圖譜學習與實踐(4)——通過例句介紹Sparql的使用


通過例句介紹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

sterfdatum@nl

http://www.w3.org/2002/07/owl#equivalentProperty

ημερομηνία_θανάτου@el

http://www.w3.org/2002/07/owl#equivalentProperty

沒年月日@ja

http://www.w3.org/2002/07/owl#equivalentProperty

resting date@en

http://www.w3.org/2002/07/owl#equivalentProperty

埋葬年月日@ja

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有幫助,在學習過程中,有什么問題,還是要多交流,共同進步。

參考資料

https://www.w3.org/TR/rdf-sparql-query/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM