SPARQL DESCRIBE query

Nils Weinander picture Nils Weinander · Mar 3, 2013 · Viewed 11k times · Source

Seems I don't grok SPARQL DESCRIBE queries. I need to retrieve the full graphs of resources matching a condition. On one SPARQL endpoint I have tried (Norwegian Rådata Nå, http://data.bibsys.no/data/query_authority.html) this works just fine:

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

I get a result with Person resources that have an owl:sameAs triple.

On other SPARQL endpoints, Onki Light (http://sparql.onki.fi/sparql.tpl) and DBPedia (http://dbpedia.org/sparql) a similar query

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

returns lots of resources which have neither rdf:Type = skos:Concept nor a skos:prefLabel, so I am obviously not doing the query correctly. How should this kind of query be stated to produce the result I need?

Answer

Thomas picture Thomas · Mar 4, 2013

The "received resources" without skos:prefLabel or skos:Concept are probably related to a resource that meets your requirements.

The SPARQL DESCRIBE query does not actually return resources matched by the graph pattern of the query, but an RDF graph that "describes" those resources. It is up to the sparql service to choose what triples are included to describe a resource. (see the standard below)

The W3C Proposed Recommendation on SPARQL 1.1 says:

The DESCRIBE form returns a single result RDF graph containing RDF data about resources. [...] The description is determined by the query service.

So, the resources you unexpectedly receive maybe describing the resources you actually want. To investigate your issue: Check the triples you should actually receive for a relation to your wanted resource. A good way is to start with LIMIT 1 to see the effect of DESCRIBE queries.

Maybe a SELECT query is what you need? It returns only the resources matched by the graph pattern.