【问题标题】:SPARQL DESCRIBE querySPARQL DESCRIBE 查询
【发布时间】:2013-02-17 22:49:09
【问题描述】:

似乎我不了解 SPARQL DESCRIBE 查询。我需要检索与条件匹配的资源的完整图表。在我尝试过的一个 SPARQL 端点上(Norwegian Rådata Nå,http://data.bibsys.no/data/query_authority.html)这工作得很好:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>

DESCRIBE ?person WHERE {
  ?person rdf:type foaf:Person .
  FILTER EXISTS { ?person owl:sameAs ?sameAs }
}
LIMIT 100

我得到一个带有 owl:sameAs 三元组的 Person 资源的结果。

在其他 SPARQL 端点上,Onki Light (http://sparql.onki.fi/sparql.tpl) 和 DBPedia (http://dbpedia.org/sparql) 有类似的查询

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>

DESCRIBE ?x WHERE {
  ?x rdf:type skos:Concept .
  FILTER EXISTS { ?x skos:prefLabel ?prefLabel }
}
LIMIT 100

返回大量既没有rdf:Type = skos:Concept 也没有skos:prefLabel 的资源,所以我显然没有正确执行查询。这种查询应该如何表述才能产生我需要的结果?

【问题讨论】:

    标签: rdf sparql


    【解决方案1】:

    没有skos:prefLabelskos:Concept 的“received resources”可能与满足您要求的资源有关

    SPARQL DESCRIBE 查询实际上并不返回与查询的图形模式匹配的资源,而是一个“描述”这些资源的 RDF 图。由 sparql 服务选择包含哪些三元组来描述资源。 (见下面的标准)

    W3C Proposed Recommendation on SPARQL 1.1 说:

    DESCRIBE 表单返回单个结果 RDF 图,其中包含有关资源的 RDF 数据。 [...] 描述由查询服务确定。

    因此,您意外收到的资源可能描述了您真正想要的资源。要调查您的问题:检查您实际应该收到的三元组与您想要的关系资源。一个好的方法是从LIMIT 1 开始,看看DESCRIBE 查询的效果。

    也许您需要一个 SELECT 查询?它只返回与图形模式匹配的资源。

    【讨论】:

    • 谢谢!我尝试了 DESCRIBE 并得到了预期的资源和一堆相关资源,就像你写的一样。 SELECT 或 CONSTRUCT 在手头的情况下不是可行的选择,因为我不知道数据的实际结构。但是,知道什么是“额外”资源,我可以在处理结果时忽略它们。
    【解决方案2】:

    正如@Thomas 所说,DESCRIBE 的标准定义不足,因此您会得到不一致的结果。但是,使用 CONSTRUCT,您可以返回许多引擎将为 DESCRIBE 返回的值,即 SPO 加上 OPS,并且在服务中始终如一地这样做。这是执行此操作的查询:

    CONSTRUCT {
       ?person ?p ?o .
       ?s ?p1 ?person .
    }
    WHERE {
       ?person rdf:type foaf:Person .
       FILTER EXISTS { ?person owl:sameAs ?sameAs } .
       ?person ?p ?o .
       ?s ?p1 ?person .
    }
    

    这将为您提供一个 RDF 图,该图“描述”绑定到 ?person 的资源,即 ?person 的所有属性以及值(对象)为 ?person 的所有属性。

    【讨论】:

    • 有趣!我在 dbpedia 上试过这个(Rådata Nå SPARQL 端点当前不工作): PREFIX rdf: w3.org/1999/02/22-rdf-syntax-ns#> PREFIX skos: w3.org/2004/02/skos/core#> CONSTRUCT { ?concept ?p ?o 。 ?s ?p1 ? 概念。 } WHERE { ?concept rdf:type skos:Concept 。过滤器存在 { ?concept skos:prefLabel ?prefLabel } 。 ?概念?p?o。 ?s ?p1 ? 概念。 } LIMIT 100 结果好坏参半。有些数据正是我想要的,有些数据不符合条件。
    • 尝试增加限制。 SPARQL 不会按任何特定顺序获取数据,因此您也可以尝试使用 ORDER BY 的 LIMIT/OFFSET 组合。
    【解决方案3】:

    SELECT 或 CONSTRUCT 在手头的情况下不是可行的选择,因为我不知道数据的实际结构

    你为什么这么说?我认为您要么只想获得资源:

    select ?x WHERE {
      ?x rdf:type skos:Concept .
      FILTER EXISTS { ?x skos:prefLabel ?prefLabel }
    }
    LIMIT 100
    

    或者他们所有的三元组:

    select ?x ?p ?y WHERE {
      ?x rdf:type skos:Concept.
      FILTER EXISTS { ?x skos:prefLabel ?prefLabel }
      ?x ?p ?y
    }
    LIMIT 100
    

    【讨论】:

    • 谢谢!我尝试了类似的方法,但搞砸了 SPARQL 语法。下一期是从 SPARQL XML 结果构建实际图形的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    相关资源
    最近更新 更多