2013-07-30 99 views
3

我想獲得存儲在芝麻存儲庫中的所有類。SPARQL查詢以獲得所有類名稱與名稱空間前綴定義

這是我的查詢

SELECT ?class ?classLabel 
WHERE { 
?class rdf:type rdfs:Class. 
?class rdfs:label ?classLabel. 
} 

這是一個與標籤返回類的所有URI。例如,

"http://example.com/A_Class" "A_Class" 
"http://example.com/B_Class" "B_Class" 

但是,如果已經定義了名稱空間前綴,我想要使用定義的名稱空間來獲取標籤。因爲如果我已經定義的命名空間前綴「恩」爲「http://example.com/」的例子,結果成爲

"http://example.com/A_Class" "ex:A_Class" 
"http://example.com/B_Class" "ex:B_Class" 
+0

http://answers.semanticweb.com/questions/23888/how-to-get-all-class-label-with-namespace-prefix-defined的副本 –

回答

3

你想一個URI前綴添加到標籤字符串的前面?

我想你可能會對URI前綴做什麼感到困惑。它們只是完整URI的簡寫,並不是URI的一部分,它們對字符串沒有任何影響。

你可以做這樣的事情,你想

SELECT ?class (CONCAT("ex:", ?classLabel) AS ?label 
WHERE { 
    ?class rdf:type rdfs:Class. 
    ?class rdfs:label ?classLabel. 
} 

什麼,但前綴將不依賴於URI的前綴。

你可以有IF()秒,測試STR的起始字符的鏈條,但它會得到快速醜(類):

BIND(IF(STRSTARTS(STR(?class), "http://example.com/"), "ex:", "other:") as ?prefix) 

然後

SELECT ... (CONCAT(?prefix, ?classLabel) AS ?label 

有幾乎當然,更容易獲得你想要的東西比在SPARQL中做到這一點:)

4

我同意其他答案,說你試圖做一件奇怪的事情,至少在問題中說過。將前綴與rdfs:label關聯並不是那麼有用,因爲結果字符串可能代表或不代表該類的實際URI。假設你想要做的是實際上找出一個前綴定義的URI的前綴名稱,你可以在SPARQL中做到這一點,而不需要大量的嵌套IF;你可以通過使用VALUESFILTER來完成。

給出的數據是這樣,其中的一些類定義(我這裏不定義任何標籤,因爲他們沒有必要在這個例子中),

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix ex1: <http://example1.com/> . 
@prefix ex2: <http://example2.com/> . 
@prefix ex3: <http://example3.com/> . 
@prefix ex4: <http://example4.com/> . 

ex1:A a rdfs:Class . 
ex1:B1 a rdfs:Class . 

ex2:A a rdfs:Class . 
ex2:B2 a rdfs:Class . 

ex3:A a rdfs:Class . 
ex3:B3 a rdfs:Class . 

ex3:A a rdfs:Class . 
ex3:B4 a rdfs:Class . 

ex4:A a rdfs:Class . 
ex4:B4 a rdfs:Class . 

可以編寫一個查詢這樣選擇所有的類,檢查它們的URI是否開始與多個定義的命名空間中的一個,並且如果是這樣,則返回類和前綴形式:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

select ?class (group_concat(?prefixedName ; separator = "") as ?prefName) where { 
    values (?prefix ?ns) { 
    ("ex1:" <http://example1.com/>) 
    ("ex2:" <http://example2.com/>) 
    ("ex3:" <http://example3.com/>) 
    } 
    ?class a rdfs:Class . 
    bind(if(strStarts(str(?class), str(?ns)), 
      concat(?prefix, strafter(str(?class), str(?ns))), 
      "") 
     as ?prefixedName) 
} 
group by ?class 
order by ?class 

其產生作爲結果:

$ arq --data data.n3 --query query.sparql 
--------------------------------------- 
| class     | prefName | 
======================================= 
| <http://example1.com/A> | "ex1:A" | 
| <http://example1.com/B1> | "ex1:B1" | 
| <http://example2.com/A> | "ex2:A" | 
| <http://example2.com/B2> | "ex2:B2" | 
| <http://example3.com/A> | "ex3:A" | 
| <http://example3.com/B3> | "ex3:B3" | 
| <http://example3.com/B4> | "ex3:B4" | 
| <http://example4.com/A> | ""  | 
| <http://example4.com/B4> | ""  | 
--------------------------------------- 
相關問題