2013-07-30 75 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> | ""  | 
--------------------------------------- 
相关问题