Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 }
}
like image 662
auino Avatar asked Feb 09 '12 10:02

auino


2 Answers

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.
}
like image 119
William Greenly Avatar answered Sep 20 '22 13:09

William Greenly


Based on the SPARQL 1.1 specification the proper way to do it would be:

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

Without support for property paths there is no way of expressing class hierarchies of arbitrary length.

like image 40
Robin Keskisarkka Avatar answered Sep 22 '22 13:09

Robin Keskisarkka