【问题标题】:OWLAPI not returning annotations and instancesOWLAPI 不返回注释和实例
【发布时间】:2014-01-02 12:29:30
【问题描述】:

在 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)

变量“实例”现在为空。

如果此类类的定义包含在建筑物本体中,则类注释也会出现同样的问题。

我可以让它在以下情况下工作:

  1. 我将实例定义直接移动到 Rooms 本体(这在生产中是不可能的,因为无论如何我都会有 2 个独立的本体)
  2. 我使用 Reasoner 类的函数(reasoner.getInstances(buildingClass, true) 从两个本体返回实例)
  3. 我将导入的本体传递给 getIndividuals 函数而不是主(房间)本体 (buildingClass.getIndividuals(manager.getImports(roomsOntology)))

解决方法没有。 1 不可能为我制作(仅用于测试目的)。当我需要检索注解时,第 2 和第 3 项不起作用,因为无法将多个本体传递给 OWLClass.getAnnotations 函数,而且 Reasoner 也没有获取注解的功能。

无论如何,我认为如果没有这些变通方法,一切都应该正常工作,因为所有本体(包括导入的本体)都在开头加载了 manager.loadOntologyFromOntologyDocument 函数。

【问题讨论】:

  • 这里有一个误解:factory.getOWLClass() 没有从本体中检索类。返回的对象可能与本体公理中提到的对象相同,也可能不同。 OWLClass 对象不绑定到本体,这就是您必须传入本体才能获取注释的原因。

标签: semantic-web owl owl-api


【解决方案1】:

问题在于owlClass.getIndividuals(OWLOntology) 不包括导入关闭。如果您希望包含导入闭包,则需要使用另一种方法:

Set&lt;OWLIndividual&gt; getIndividuals(Set&lt;OWLOntology&gt; ontologies);

本体集合可以是任意集合;要使用导入闭包,请使用

ontology.getImportsClosure()

请注意,在所有情况下,这将只返回被断言对类很长的个人。如您所述,如果需要推理,则需要使用推理器。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 2022-12-12
    • 2017-10-19
    • 1970-01-01
    • 2017-01-05
    • 2010-11-03
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多