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