OWL Api, move class from parent A to B

2019-06-06 16:20发布

问题:

I'm having a quick question regarding the usage of the owl api.

Say I have a class called Species, which has a Subclass mammal, which has a Subclass Primate, which has a subclass Human.

species -> mammal -> primate -> human

For some reason, I would like to reclassify this in our software and say that Primates are not longer considered Mammals, instead they should be a direct subclass of a Species.

Meaning our graph should look like this now

species -> primate -> human

can anybody please point me in the right direction?

Finding our the parent class is easy enough, using the owl-api

reasoner.getSuperClasses(chield, true).entities().collect(Collectors.toSet[OWLClass])

but how can I 'detach' my class now from it's parent?

回答1:

If you have an ontology where the relations :

  • species -> mammal
  • mammal -> primate
  • primate -> human

are directly asserted (not the result of a reasoning computation).

Then in owlapi this is represented as axioms :

  1. OWLSubClass(mammal, species)
  2. OWLSubClass(primate, mammal)
  3. OWLSubClass(human, primate)

The solution could be to remove the old subClass assertion and add the new one (unless you are playing with Allen-temporal).

OWLDataFactory factory = manager.getOWLDataFactory();
ontology.remove(factory.getOWLSubClassOfAxiom(primate, mammal));
ontology.add(factory.getOWLSubClassOfAxiom(primate, species));

Note : if you are using a version older than 5 of owlapi then we must use the OWLOntologyManager to remove/add axioms in an ontology :

manager.remove(ontology, axiom)
manager.add(ontology, axiom)

If the specialization relation aren't directly asserted in your ontology; it will be far more complex. You have to know why 'human' is view a subclass of 'mammal'. Maybe the 'explanation' system of the 'reasoner' can help you.



标签: java owl owl-api