Using SPARQL for limited RDFS and OWL reasoning

owl, python, rdf, rdflib, sparql

Solution

Although this is a library request problem and, as such, off topic for StackOverflow, I would like to point out that for many cases, you can answer both of these queries using sightly more sophisticated SPARQL queries. For both of these cases, you could use the following query to get the results you want, where `<class-of-interest>` is `:SuperClass` or `:SiblingClass`:

select ?x where {
  ?x rdf:type/(rdfs:subClassOf|owl:equivalentClass)* <class-of-interest> .
}

This finds `?x`s that have a path to starting with `rdf:type` and followed by zero or more of `rdfs:subClassOf` or `owl:equivalentClass` and eventually gets to `:SuperType`.

For instance, consider the following data in Turtle/N3. (As an aside, if you're asking questions about running queries against data, provide data that we can work with. You provided something sort of like RDF data in your question, but nothing that we could copy and paste and write a query against.)

@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <http://stackoverflow.com/q/20474862/1281433/>

:i1 a :C .
:C rdfs:subClassOf :D .
:D rdfs:subClassOf :E .

:i2 a :F .
:F rdfs:subClassOf :G1 .
:G1 owl:equivalentClass :G2 .
:G2 rdfs:subClassOf :H .

You can run a query like the one above to select individuals and their types (note that `a` is shorthand in SPARQL and Turtle/N3 for `rdf:type`):

prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <http://stackoverflow.com/q/20474862/1281433/>

select ?i ?type where {
  ?i a/(rdfs:subClassOf|owl:equivalentClass)* ?type
}
--------------
| i   | type |
==============
| :i2 | :F   |
| :i2 | :G1  |
| :i2 | :G2  |
| :i2 | :H   |
| :i1 | :C   |
| :i1 | :D   |
| :i1 | :E   |
--------------

Problem

What I'm currently using rdflib for creating and managing RDF graphs in Python. RDFlib doesn't do any RDFS or OWL reasoning, though. This leads to results like the following: If I have ``` A rdf:type MyType . MyType rdfs:subClassOf SuperType . ``` and I ask ``` select ?x where {?x rdf:type SuperType} ``` then I get nothing, but I'd like to get `A` (by RDFS semantics). The same thing happens with `owl:equivalentClass`. If I have ``` A rdf:type MyType . MyType owl:equivalentClass SiblingType . ``` and I ask ``` select ?x where {?x rdf:type SiblingType} ``` I'd like to get `A`, but I get nothing. Is there a way to get these results?

Original source