SPARQL Examples – List Classes
Posted on Dec 19, 2017 (last modified May 7, 2021)
Example SPARQL queries that can help you list the classes in an ontology.
List all classes
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?type
WHERE {
?s a ?type.
}
Note: The SPARQL keyword a
is a shortcut for the common predicate rdf:type
, giving the class of a resource.
List root classes
SELECT ?directSub ?super
WHERE { ?directSub rdfs:subClassOf ?super .
FILTER NOT EXISTS {
?directSub rdfs:subClassOf ?otherSub .
FILTER (?otherSub != ?directSub)
}
}
List all classes with a given prefix
PREFIX bc: <http://base22.com/ont/bc#>
SELECT DISTINCT ?type
WHERE {
?subject a ?type.
FILTER( STRSTARTS(STR(?type),str(bc:)) )
}
List class hierarchy
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?subject ?label ?supertype
WHERE {
{ ?subject a owl:Class . } UNION { ?individual a ?subject . } .
OPTIONAL { ?subject rdfs:subClassOf ?supertype } .
OPTIONAL { ?subject rdfs:label ?label }
} ORDER BY ?subject
Note that when a reasoner is enabled classes may typically be inferred to be rdfs:subClassOf
themselves and rdfs:subClassOf
any parent class, not just the direct parent.
List class hierarchy – filtered
Give a class hierarchy, but filter out several structural elements so that we only end up with the unique classes in our ontology.
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?subject ?label ?supertype
WHERE {
{ ?subject a owl:Class . } UNION { ?individual a ?subject . } .
OPTIONAL { ?subject rdfs:subClassOf ?supertype } .
OPTIONAL { ?subject rdfs:label ?label }.
FILTER (?subject != owl:Class &&
?subject != rdf:List &&
?subject != rdf:Property &&
?subject != rdfs:Class &&
?subject != rdfs:Datatype &&
?subject != rdfs:ContainerMembershipProperty &&
?subject != owl:DatatypeProperty &&
?subject != owl:NamedIndividual &&
?subject != owl:Ontology )
} ORDER BY ?subject
Note that when a reasoner is enabled classes may typically be inferred to be rdfs:subClassOf themselves and rdfs:subClassOf any parent class, not just the direct parent.
List class hierarchy with direct subclasses only
This is similar to the query above, but uses the Sesame-specific sesame:directSubClassOf to get only direct subclasses. This would work in any RDF4J (formerly Sesame) system such as Graph DB.
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <https://codyburleson.com/hyperg/>
SELECT DISTINCT ?subject ?label ?supertype
WHERE {
{
?subject a owl:Class .
OPTIONAL { ?subject sesame:directSubClassOf ?supertype } .
OPTIONAL { ?subject rdfs:label ?label }.
}
FILTER (?subject != owl:Class &&
?subject != rdf:List &&
?subject != rdf:Property &&
?subject != rdfs:Class &&
?subject != rdfs:Datatype &&
?subject != rdfs:ContainerMembershipProperty &&
?subject != owl:DatatypeProperty &&
?subject != owl:NamedIndividual &&
?subject != owl:Ontology &&
?subject != ?supertype)
} ORDER BY ?subject