在 OWLAPI 中,通过 owl:imports 语句导入的本体存在问题。问题是导入的本体中包含的类和类注释的实例没有被检索和返回。
可以说我有本体房间和本体建筑物。
然后在本体房间中,我有以下语句,该语句应该将建筑物本体加载到房间本体中。
<owl:Ontology rdf:about="http://example.com/rooms.xml">
<owl:imports rdf:resource="http://example.com/buildings.xml"/>
</owl:Ontology>
然后在 OWLAPI 我加载本体房间(应该自动包含建筑物)
manager = OWLManager.createOWLOntologyManager()
roomsOntology = manager.loadOntologyFromOntologyDocument(IRI.create("http://example.com/rooms.xml"))
reasoner = Reasoner.new(roomsOntology)
factory = manager.getOWLDataFactory()
之后,从 Buildings 本体中检索一个类仍然可以按预期工作:
buildingClass = factory.getOWLClass(IRI.create("http://example.com/buildings.xml#Building"))
当我想获取类 Building 的实例(这些实例的定义包含在导入的 Buildings 本体中)时,它什么也不返回:
instances = buildingClass.getIndividuals(roomsOntology)
变量“实例”现在为空。
如果此类类的定义包含在建筑物本体中,则类注释也存在同样的问题。
在以下情况下,我能够使其工作:
- 我将实例定义直接移动到 Rooms 本体(这在生产中是不可能的,因为无论如何我都会有 2 个独立的本体)
- 我使用 Reasoner 类的函数(
reasoner.getInstances(buildingClass, true)
从两个本体返回实例) - 我将导入的本体传递给 getIndividuals 函数而不是主(房间)本体(
buildingClass.getIndividuals(manager.getImports(roomsOntology))
)
解决方法没有。1 不可能为我制作(仅用于测试目的)。当我需要检索注释时,2 号和 3 号不起作用,因为无法将多个本体传递给OWLClass.getAnnotations
函数,而且 Reasoner 也没有获取注释的函数。
无论如何,我认为如果没有这些变通方法,一切都应该工作,因为所有本体,包括导入的本体,在开始时都加载了manager.loadOntologyFromOntologyDocument
函数。