使用相同的 IRI 导入 ontology
Import ontology with same IRI
我有一个 ontology,它包含两个单独的文件:
- tbox.owl
- abox.owl
(后者只包含实例)
我的想法是用Manchester OWL API 5读取Abox,得到签名中的所有对象属性(举例)
Abox 使用 owl:imports
包含 Tbox。但是 - 根据我的理解 - 首先我必须将 Tbox 的远程 IRI(例如 http://mywebsite.com/ontology/artists.owl
)映射到我系统中的本地文件。
这是我试过的:
// Create an ontology manager
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
// Manually map imports
IRI remoteIRI = IRI.create("http://mywebsite.com/ontology/tbox.owl");
IRI localIRI = IRI.create(new File("tbox.owl"));
SimpleIRIMapper mapper = new SimpleIRIMapper(remoteIRI, localIRI);
manager.getIRIMappers().add(mapper);
// Read individuals (i.e. ABox)
File file = new File("abox.owl");
OWLOntology ABox = manager.loadOntologyFromOntologyDocument(file);
这是它引发的异常:
Exception in thread "main" org.semanticweb.owlapi.model.OWLOntologyAlreadyExistsException: Ontology already exists. OntologyID(OntologyIRI(<http://mywebsite.com/ontology/tbox.owl>) VersionIRI(<null>))
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.load(OWLOntologyManagerImpl.java:1122)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOntologyManagerImpl.java:1057)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:1007)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:1020)
at examples.PopulateDatabaseWithPropIndividuals.main(PopulateDatabaseWithPropIndividuals.java:71)
Caused by: org.semanticweb.owlapi.model.OWLOntologyRenameException: Could not rename ontology. An ontology with this ID already exists: OntologyID(OntologyIRI(<http://mywebsite.com/ontology/tbox.owl>) VersionIRI(<null>))
有什么想法吗?
这两个本体不能有相同的 IRI,因为这会在持有它们的管理器中产生歧义,更一般地说,从重用的角度来看会产生歧义。另一个 ontology 不可能明确地识别它导入了你的哪个本体,如果你的本体是要制作的 public 或者即使它们是私有的但你希望在其他一些地方使用它们项目。
我推荐的解决方法是修改 abox ontology IRI 并向其添加 owl:imports
语句,导入 tbox ontology。它可以在另一个方向完成(tbox 可以导入 abox),尽管这不是最常见的模式;您还可以添加第三个 ontology,其目的只是聚合两个本体,并且仅包含两个导入语句,用于您的 abox 和 tbox。
我有一个 ontology,它包含两个单独的文件:
- tbox.owl
- abox.owl
(后者只包含实例)
我的想法是用Manchester OWL API 5读取Abox,得到签名中的所有对象属性(举例)
Abox 使用 owl:imports
包含 Tbox。但是 - 根据我的理解 - 首先我必须将 Tbox 的远程 IRI(例如 http://mywebsite.com/ontology/artists.owl
)映射到我系统中的本地文件。
这是我试过的:
// Create an ontology manager
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
// Manually map imports
IRI remoteIRI = IRI.create("http://mywebsite.com/ontology/tbox.owl");
IRI localIRI = IRI.create(new File("tbox.owl"));
SimpleIRIMapper mapper = new SimpleIRIMapper(remoteIRI, localIRI);
manager.getIRIMappers().add(mapper);
// Read individuals (i.e. ABox)
File file = new File("abox.owl");
OWLOntology ABox = manager.loadOntologyFromOntologyDocument(file);
这是它引发的异常:
Exception in thread "main" org.semanticweb.owlapi.model.OWLOntologyAlreadyExistsException: Ontology already exists. OntologyID(OntologyIRI(<http://mywebsite.com/ontology/tbox.owl>) VersionIRI(<null>))
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.load(OWLOntologyManagerImpl.java:1122)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOntologyManagerImpl.java:1057)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:1007)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:1020)
at examples.PopulateDatabaseWithPropIndividuals.main(PopulateDatabaseWithPropIndividuals.java:71)
Caused by: org.semanticweb.owlapi.model.OWLOntologyRenameException: Could not rename ontology. An ontology with this ID already exists: OntologyID(OntologyIRI(<http://mywebsite.com/ontology/tbox.owl>) VersionIRI(<null>))
有什么想法吗?
这两个本体不能有相同的 IRI,因为这会在持有它们的管理器中产生歧义,更一般地说,从重用的角度来看会产生歧义。另一个 ontology 不可能明确地识别它导入了你的哪个本体,如果你的本体是要制作的 public 或者即使它们是私有的但你希望在其他一些地方使用它们项目。
我推荐的解决方法是修改 abox ontology IRI 并向其添加 owl:imports
语句,导入 tbox ontology。它可以在另一个方向完成(tbox 可以导入 abox),尽管这不是最常见的模式;您还可以添加第三个 ontology,其目的只是聚合两个本体,并且仅包含两个导入语句,用于您的 abox 和 tbox。