问题 SPARQL DESCRIBE查询


似乎我没有grok SPARQL DESCRIBE查询。我需要检索匹配条件的资源的完整图表。在我尝试过的一个SPARQL端点上(NorwegianRådataNå, 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

我得到的结果是Person资源有一个owl:sameAs triple。

在其他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,所以我显然没有正确地进行查询。应该如何陈述这种查询以产生我需要的结果?


8993
2018-03-03 22:15


起源



答案:


收到资源“没有 skos:prefLabel 要么 skos:Concept 很可能 与满足您要求的资源相关

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

W3C关于SPARQL 1.1的建议书 说:

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

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

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


10
2018-03-04 08:48



谢谢!我尝试了DESCRIBE <resource URI>并获得了预期的资源和一堆相关资源,就像你写的一样。在手头的情况下,SELECT或CONSTRUCT不是可行的选项,因为我不知道数据的实际结构。但是,知道“额外”资源是什么,我可以在处理结果时忽略它们。 - Nils Weinander


答案:


收到资源“没有 skos:prefLabel 要么 skos:Concept 很可能 与满足您要求的资源相关

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

W3C关于SPARQL 1.1的建议书 说:

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

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

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


10
2018-03-04 08:48



谢谢!我尝试了DESCRIBE <resource URI>并获得了预期的资源和一堆相关资源,就像你写的一样。在手头的情况下,SELECT或CONSTRUCT不是可行的选项,因为我不知道数据的实际结构。但是,知道“额外”资源是什么,我可以在处理结果时忽略它们。 - Nils Weinander


在手头的情况下,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

1
2018-01-08 10:18



谢谢!我尝试了类似的东西但是搞砸了SPARQL语法。下一个问题是从SPARQL XML结果构建实际图形的最佳方法。 - Nils Weinander


正如@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 以及其值(对象)是?人的所有属性。


1
2018-04-25 14:11



有趣!我在dbpedia上尝试了这个(RådataNåSPARQL端点目前无效):PREFIX rdf:<w3.org/1999/02/22-rdf-syntax-ns#>; PREFIX skos:<w3.org/2004/02/skos/core#>; CONSTRUCT {?概念?p?o。 ?s?p1?概念。 } WHERE {?concept rdf:type skos:Concept。 FILTER EXISTS {?concept skos:prefLabel?prefLabel}。 ?概念?p?o。 ?s?p1?概念。 } LIMIT 100结果混合。有些数据正是我想要的,有些则不符合条件。 - Nils Weinander
尝试增加LIMIT。 SPARQL不会以任何特定顺序获取数据,因此您也可以尝试使用ORDER BY进行LIMIT / OFFSET组合。 - scotthenninger