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 |
--------------
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…