我想获取所有存储在芝麻存储库中的类。
这是我的问题
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/“定义了名称空间前缀"ex”,则结果为
"http://example.com/A_Class" "ex:A_Class"
"http://example.com/B_Class" "ex:B_Class"发布于 2013-07-30 20:01:47
您想在标签字符串的前面添加URI前缀吗?
我想您可能对URI前缀的作用感到困惑。它们只是完整URI的简写,不是URI的一部分,与字符串没有任何关系。
你可以用它做你想做的事情
SELECT ?class (CONCAT("ex:", ?classLabel) AS ?label
WHERE {
?class rdf:type rdfs:Class.
?class rdfs:label ?classLabel.
}但是前缀将不依赖于URI的前缀。
你可以有一个IF()链来测试STR(?class)的起始字符,但是它很快就会变得丑陋:
BIND(IF(STRSTARTS(STR(?class), "http://example.com/"), "ex:", "other:") as ?prefix)然后
SELECT ... (CONCAT(?prefix, ?classLabel) AS ?label不过,几乎可以肯定有一种比在SPARQL中更容易获得所需内容的方法:)
发布于 2013-07-30 21:53:21
我同意其他答案,即你正在尝试做一件奇怪的事情,至少在问题中是这样。将前缀与rdfs:label关联并没有那么有用,因为结果字符串可能表示类的实际URI,也可能不表示类的实际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> | "" |
---------------------------------------https://stackoverflow.com/questions/17939197
复制相似问题