在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的实例时(这些实例的定义包含在导入的建筑物本体中),那么它什么都不返回:
instances = buildingClass.getIndividuals(roomsOntology)
变量'实例'现在为空。
如果在建筑物本体中包含此类的定义,则类注释也会出现同样的问题。
我能够在以下情况下使其发挥作用:
reasoner.getInstances(buildingClass, true)
返回两个本体的实例)buildingClass.getIndividuals(manager.getImports(roomsOntology))
)解决方法没有。 1是不可能为我做的(它仅用于测试目的)。当我需要检索注释时,2号和3号不起作用,因为无法将多个本体传递给OWLClass.getAnnotations
函数,并且Reasoner也没有函数来获取注释。
无论如何,我认为一切都应该没有这些解决方法,因为所有本体,包括导入的本体,都是在manager.loadOntologyFromOntologyDocument
函数的开头加载的。
答案 0 :(得分:4)
问题是owlClass.getIndividuals(OWLOntology)
不包括进口关闭。如果您希望包含导入闭包,则需要使用另一种方法:
Set<OWLIndividual> getIndividuals(Set<OWLOntology> ontologies);
本体集可以是任何集合;要使用导入闭包,请使用
ontology.getImportsClosure()
请注意,在所有情况下,这将仅返回声称对课程很长的个人。如果需要进行推理,则需要使用推理器,如上所述。