2013-03-03 132 views
9

似乎我不赞赏SPARQL DESCRIBE查询。我需要检索符合条件的资源的完整图形。在一个SPARQL端点我已经试过(挪威RådataNA,http://data.bibsys.no/data/query_authority.html)这工作得很好:SPARQL DESCRIBE查询

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 

我得到的是有一只猫头鹰人资源的结果:sameAs的三倍。

在其他SPARQL端点,Onki光(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资源:种类= SKOS:概念,也没有一个SKOS:prefLabel,所以我显然没有正确地进行查询。应该如何陈述这种查询来产生我需要的结果?

回答

10

没有skos:prefLabelskos:Concept的“收到资源”可能是与满足您的要求的资源。

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

W3C Proposed Recommendation on SPARQL 1.1的说:

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

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

也许SELECT查询是你所需要的?它只返回图形模式匹配的资源。

+0

谢谢!我尝试了DESCRIBE ,并获得了期望的资源和一堆相关资源,就像你写的一样。因为我不知道数据的实际结构,所以SELECT或CONSTRUCT在手边的情况下不是可行的选项。但是,知道“额外”资源是什么,当我处理结果时,我可以忽略它们。 – 2013-03-04 10:09:31

1

选择或构建还没有在手的情况下可行的选择,因为我不知道数据

的实际结构为什么这么说?我认为你要么想只有资源:

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 
+0

谢谢!我尝试过类似的东西,但是却破坏了SPARQL的语法。下一个问题是从SPARQL XML结果构建实际图形的最佳方法。 – 2015-01-08 20:37:20

1

正如@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所有属性,所有的属性,它的值(对象)是人吗?

+0

有趣!我在dbpedia上试了这个(RådataNåSPARQL端点目前不工作): PREFIX rdf: PREFIX skos: CONSTRUCT {0}概念?p?o。 ?s?p1?的概念。 } 其中概念rdf:类型skos:概念。 FILTER EXISTS {?concept skos:prefLabel?prefLabel}。 ?概念?p?o。 ?s?p1?的概念。 } LIMIT 100 结果不一。有些数据正是我想要的,有些则不符合条件。 – 2016-05-02 09:02:36

+0

尝试增加LIMIT。 SPARQL不会以任何特定顺序获取数据,因此您还可以尝试使用ORDER BY的LIMIT/OFFSET组合。 – scotthenninger 2016-05-02 13:07:14