关于猫头鹰api的用法,我有一个简短的问题。

假设我有一个叫Species的类,它有一个子类哺乳动物,它有一个子类灵长类,又有一个人类子类。

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

由于某种原因,我想在我们的软件中对此进行重新分类,并说不再将灵长类动物视为哺乳动物,而应将它们作为物种的直接子类。

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

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

有人能指出我正确的方向吗?

使用owl-api查找父类很容易

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


但是如何现在将我的班级与其父级“分离”?

最佳答案

如果您有一个本体关系,则:


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


直接声明(不是推理计算的结果)。

然后在owlapi中将其表示为公理:


OWLSubClass(哺乳动物,种​​类)
OWLSubClass(灵长类,哺乳动物)
OWLSubClass(人类,灵长类)


解决方法可能是删除旧的subClass断言,然后添加新的断言(除非您正在使用Allen-temporal)。

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


注意:如果您使用的owlapi版本早于5,则必须使用OWLOntologyManager删除/添加本体中的公理:

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


如果没有在您的本体中直接断言专业化关系;它将更加复杂。您必须知道为什么“人类”是“哺乳动物”的子类。也许“原因”的“解释”系统可以为您提供帮助。

08-03 19:50