【问题标题】:SPARQL query to get all class label with namespace prefix definedSPARQL 查询以获取定义了命名空间前缀的所有类标签
【发布时间】:2013-07-30 05:51:35
【问题描述】:

我想获取存储在 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"

【问题讨论】:

标签: sparql semantic-web


【解决方案1】:

您想在标签字符串的前面添加 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 中更容易获得所需内容的方法 :)

【讨论】:

    【解决方案2】:

    我同意其他答案,即您正在尝试做一件奇怪的事情,至少正如问题中所述。将前缀与rdfs:label 相关联并不是那么有用,因为生成的字符串可能代表也可能不代表类的实际URI。假设您要做的实际上是在给定一组前缀定义的情况下找出 URI 的前缀名称,您可以在 SPARQL 中执行此操作,而无需大量嵌套的 IFs;您可以使用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> | ""       |
    ---------------------------------------
    

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2016-07-19
      相关资源
      最近更新 更多