我同意其他答案,说你试图做一件奇怪的事情,至少在问题中说过。将前缀与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的副本 –