OWL Api,将 class 从 parent A 移动到 B

OWL Api, move class from parent A to B

我有一个关于 owl api.

用法的快速问题

假设我有一个名为 Species 的 class,它有一个 Subclass 哺乳动物,它有一个 Subclass 灵长类动物,它有一个 subclass 人类。

物种 -> 哺乳动物 -> 灵长类动物 -> 人类

出于某种原因,我想在我们的软件中重新class确认这一点,并说灵长类动物不再被视为哺乳动物,它们应该是一个物种的直接子class。

这意味着我们的图表现在应该看起来像这样

物种 -> 灵长类动物 -> 人类

谁能给我指出正确的方向?

找到我们的 parent class 很容易,使用 owl-api

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

但是我现在如何 'detach' 我的 class 从 parent?

如果你有一个ontology关系:

  • 物种 -> 哺乳动物
  • 哺乳动物 -> 灵长类动物
  • 灵长类动物 -> 人类

直接断言(不是推理计算的结果)。

然后在 owlapi 中,这表示为公理:

  1. OWLSubClass(哺乳动物,物种)
  2. OWLSubClass(灵长类动物,哺乳动物)
  3. OWLSubClass(人类,灵长类动物)

解决方案可能是删除旧的子类断言并添加新的(除非您使用的是 Allen-temporal)。

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

注意:如果您使用的是 owlapi 5 之前的版本,那么我们必须使用 OWLOntologyManager 来 remove/add ontology 中的公理:

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

如果您的 ontology 中没有直接断言专业化关系;它会复杂得多。你必须知道为什么 'human' 是视图 'mammal' 的子类。也许'reasoner'的'explanation'系统可以帮到你