SPARQL查询以获取定义了名称空间前缀的所有类标签

时间:2013-07-30 05:51:36

标签: sparql semantic-web

我想获取存储在sesame存储库中的所有类。

这是我的查询

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"

2 个答案:

答案 0 :(得分:4)

您想在标签字符串的前面添加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中做到这一点更简单:)

答案 1 :(得分: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> | ""       |
---------------------------------------