我目前正在建模一个新的本体,在导入本体时,我注意到一个对我来说看起来像错误的行为。这是过程。
我创建了一个
base-ontology
文件,其中包含一个名为 BaseClass
的类。 我想将 base-ontology
导入到 child-ontology
文件中以创建 ChildClass
,它是 BaseClass
的子类。这按预期工作。
最后我想将
child-ontology
文件导入到我的 ABox 文件中以实例化 ChildClass
。然而,Protege 不会让我这样做。我总是在工具中收到以下错误消息:
Caused by: java.io.IOException: Server returned HTTP response code: 500 for URL: http://www.example.org/base-ontology
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.base/java.net.HttpURLConnection.getResponseCode(Unknown Source)
at org.semanticweb.owlapi.io.AbstractOWLParser.connect(AbstractOWLParser.java:148)
at org.semanticweb.owlapi.io.AbstractOWLParser.getInputStream(AbstractOWLParser.java:113)
... 32 common frames omitted
ERROR 15:56:02 An error occurred whilst extracting the Ontology Id from the imported ontology: {}
java.lang.NullPointerException: null
at org.protege.editor.owl.model.repository.MasterOntologyIDExtractor.getOntologyId(MasterOntologyIDExtractor.java:27)
at org.protege.editor.owl.ui.ontology.imports.wizard.page.AnticipateOntologyIdPage.checkImport(AnticipateOntologyIdPage.java:109)
at org.protege.editor.owl.ui.ontology.imports.wizard.page.AnticipateOntologyIdPage.lambda$new$0(AnticipateOntologyIdPage.java:44)
at java.base/java.lang.Thread.run(Unknown Source)
在我看来,Protege 想要从不存在的服务器加载文件(也检查了 Protege 源代码中的行为)。
我检查了
catalog-v001.xml
文件,它缺少 uri
标签,表明它是否可以找到 base-ontology.ttl
的物理文件,但即使在手动添加标签后(基于here找到的文档),它仍然尝试从互联网上的资源加载 base-ontology
的导入。
使用的 Protege 版本是
5.6.4
,但我也用 5.5.0
尝试过,结果相同。所有文件均由 Protege 编辑器创建,无需手动修改文件(除了最后一步尝试修复问题)。
如果我从
child-ontology.ttl
文件中删除导入语句,我可以毫无问题地导入两个本体。
这是 Protege 中可重现的错误,并且可以在其他计算机上重新创建,还是我做错了什么?
旁注:我坐在公司代理后面,将自定义证书注入到链中,这可能是问题的一部分(但我不知道如何,因为 Protege 应该从我的磁盘加载文件)。
这是
base-ontology.ttl
的文件:
@prefix : <http://www.example.org/base-ontology/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.example.org/base-ontology/> .
<http://www.example.org/base-ontology> rdf:type owl:Ontology .
### http://www.example.org/base-ontology#BaseClass
:BaseClass rdf:type owl:Class .
这是
child-ontology.ttl
的课程:
@prefix : <http://www.example.org/child-ontology/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.example.org/child-ontology/> .
<http://www.example.org/child-ontology> rdf:type owl:Ontology ;
owl:imports <http://www.example.org/base-ontology> .
### http://www.example.org/child-ontology#ChildClass
:ChildClass rdf:type owl:Class ;
rdfs:subClassOf <http://www.example.org/base-ontology/BaseClass> .
这是 Protege 创建的
catalog-v001.xml
文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<group id="Folder Repository, directory=, recursive=true, Auto-Update=true, version=2" prefer="public" xml:base=""/>
</catalog>
这是我手动添加物理文件位置的文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<uri id="User Entered Import Resolution" name="http://www.example.org/base-ontology" uri="base-ontology.ttl"/>
<group id="Folder Repository, directory=, recursive=true, Auto-Update=true, version=2" prefer="public" xml:base=""/>
</catalog>
当您使用 Protege 和 owl-api 标记此问题时,我最初认为这可能是 AutoIRIMapper(负责加载在指定文件夹中找到的本体的本地副本的 OWLAPI 类)的问题。
AutoIRIMapper 不支持 ttl 文件,而且您只在文件中输入一个条目,而不是文件夹,所以我预计 AutoIRIMapper 不是问题的一部分。
这可能是一个 Protege 问题 - 但我猜你需要一个完整的文件 URL 而不仅仅是文件名。您是否尝试过添加
file:///<local path in your computer>/base-ontology.ttl
到您的注册表文件?