我同意其他答案,說你試圖做一件奇怪的事情,至少在問題中說過。將前綴與rdfs:label
關聯並不是那麼有用,因爲結果字符串可能代表或不代表該類的實際URI。假設你想要做的是實際上找出一個前綴定義的URI的前綴名稱,你可以在SPARQL中做到這一點,而不需要大量的嵌套IF
;你可以通過使用VALUES
和FILTER
來完成。
給出的數據是這樣,其中的一些類定義(我這裏不定義任何標籤,因爲他們沒有必要在這個例子中),
@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> | "" |
---------------------------------------
http://answers.semanticweb.com/questions/23888/how-to-get-all-class-label-with-namespace-prefix-defined的副本 –