SPARQL: Get all the entities of subclasses of a certain class

auino picture auino · Feb 9, 2012 · Viewed 20.7k times · Source

I've to get all the instances of a class C and subclasses (direct or indirect) of C, in SPARQL.

I can get all the direct subclasses of C in this way:

SELECT ?entity
WHERE {
  ?subclass rdfs:subClassOf :C .
  ?entity rdf:type ?subclass .
}

But I can't get the instances of an indirect subclass and neither any instance of C.

As I know (I've pre-calculated them) all the subclasses (direct and indirect of C), and I can build a dynamic query, is it possible build a query like the following one?

SELECT ?entity
WHERE {
  ?entity rdf:type in <list>.
}

Thanks to everyone.

EDIT:

I've just solved it, even if in a not elegant way.

SELECT ?entity
WHERE {
  { ?entity rdf:type :C }
  UNION { ?entity rdf:type :SubClass1 }
  UNION { ?entity rdf:type :SubClass2 }
  UNION { ?entity rdf:type :SubClass3 }
}

Answer

William Greenly picture William Greenly · Feb 9, 2012

A better solution is to use property path expressions in SPARQL 1.1

This would be rewritten as:

SELECT ?entity
WHERE {
  ?entity rdf:type ?type.
  ?type rdfs:subClassOf* :C.
}