I want to exctract DBPedia ontology classes hiearchy from an ontology file dbpedia_2016-10.owl
(downloaded from https://wiki.dbpedia.org/downloads-2016-10, and I built this method by refering to some other codes as I am beginner in this area:
public static void importOntology(String ontologyFile) throws Exception {
File file = new File(ontologyFile);
if (file.exists()) {
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
OWLOntology ontology = manager.loadOntologyFromOntologyDocument(file);
Reasoner reasoner=new Reasoner(ontology);
if (!reasoner.isConsistent()) {
throw new Exception("Ontology is inconsistent");
}
for (OWLClass c :ontology.getClassesInSignature(true)) {
String classString = c.toString();
System.out.println(classString);
if (classString.contains("#")) {
classString = classString.substring(classString.indexOf("#")+1,classString.lastIndexOf(">"));
}
Set<OWLClassExpression> superclasses = c.getSuperClasses(ontology);
if (superclasses.isEmpty()) {
System.out.println(classString + " is owl#Thing.");
} else {
for (OWLClassExpression superc:superclasses) {
System.out.println(superc + " is a parent.");
}
}
}
}
}
When I declare and instanciate the HermiT reasoner, I get this exception:
org.semanticweb.HermiT.datatypes.UnsupportedDatatypeException: HermiT supports all and only the datatypes of the OWL 2 datatype map, see
http://www.w3.org/TR/owl2-syntax/#Datatype_Maps.
The datatype 'http://dbpedia.org/datatype/hour' is not part of the OWL 2 datatype map and
no custom datatype definition is given;
therefore, HermiT cannot handle this datatype.
Now, I undestand that HermiT is complaining about a datatype that it does not recognize, but how to solve this without modifyng the ontology?
I am not sure if it would help, but these are the depencies of my project:
<dependencies>
<dependency>
<groupId>com.hermit-reasoner</groupId>
<artifactId>org.semanticweb.hermit</artifactId>
<version>1.3.8.4</version>
</dependency>
<dependency>
<groupId>net.sourceforge.owlapi</groupId>
<artifactId>owlexplanation</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
Thanks in advance for any guidance!
To test this, I loaded the DBPedia ontology into Protege 5.5 and used HermiT 1.4.3.517 to reason over it. This works without problem. I therefore think you should look at your OWL API and HermiT maven dependencies.
Update
You also seem to be starting the reasoner incorrectly. Here some working code using the Maven dependencies above.
What could be wrong with your code?
(1) This line
Reasoner reasoner=new Reasoner(ontology);
is suspicious because (a) it not clear where you got theReasoner
class from and (b) does not seem to come from HermiT as the constructors forReasoner
in HermiT have different signatures.(2) The fact that you have a dependency on
owlexplanation
rather thanowlapi-distribution
is suspicious.