我正在尝试使用 Java 中的 OWL-api 加载两个本体。我加载它们的方式是这样的:
String onto1_iri = "http://purl.obolibrary.org/obo/psdo.owl"
String onto2_iri = "http://purl.obolibrary.org/obo/stato.owl";
OWLOntologyManager onto_manager = OWLManager.createOWLOntologyManager();
OWLOntology onto1 = onto_manager.loadOntology(IRI.create(onto1_iri.trim()));
OWLOntology onto2 = onto_manager.loadOntology(IRI.create(onto2_iri.trim()));
我已经为这个项目工作了四个星期,但直到下周,一切都运行得很完美。然而,我两天前尝试重新运行代码,却得到了错误
OWLOntologyDocumentAlreadyExistsException
。我一直在尝试查找导致错误的原因,并且根据 owl-api 文档,它说,An exception that describes the situation where there was an attempt to create or load an ontology where the corresponding ontology document IRI already was already mapped to an ontology.
但是,我无法找到解决方案...
有什么办法可以解决这个问题吗?下图显示了它抛出的消息。
正在加载的本体或其导入关闭在过去几周内是否发生了变化?
当正在加载的本体与已加载的本体发生冲突时,就会发生您看到的错误 - 具体来说,同一个本体文档似乎被不同内容引用了两次。如果两个本体的导入闭包中的两个不同的 URL 加载具有相同本体 IRI 的两个不同本体(例如,同一本体的两个不同版本),则可能会发生这种情况。导入不允许指定版本,该版本是本体的一部分同一本体的两个不同版本不能在一个管理器中共存的原因。
假设发生了一些超出您控制范围的本体更改,我尝试的第一件事是为每个本体使用一个管理器 - 如果冲突出现在合并的导入闭包中(一个管理器必须解决),这可以解决问题所有都从同一个本体 IRI 映射到本体导入闭包本体,而两个则没有该约束)。
如果这没有帮助,则需要识别冲突的导入。在 owlapi GitHub 存储库 ID 上创建问题可能是最好的方法。