私は通常、オントロジーを 2 つの異なるファイルに保存します。
最初のオントロジー ファイルには、クラス、サブクラス、データ プロパティ、およびオブジェクト プロパティが含まれます。
すべての個人と個人間の関係を含む 2 番目のファイル。
したがって、完全なモデルを作成するには、これら 2 つのファイルをマージする必要があります。owlapiを使用してこれをどのように達成できるのだろうか?
Jena では、次のようにします。
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM,
null);
try {
model.read(new FileInputStream(MyOntologyFile), "...");
model.read(new FileInputStream(MyOntologyWithIndividualsFile), "...");
} catch (Exception e) {
log.error("Loading Model failed:" + e);
}
同様に、owlapi を使用してオントロジー ファイルをロードしようとすると、次のエラーが発生します。
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
OWLObjectRenderer renderer = new DLSyntaxObjectRenderer();
File file = new File(MyOntologyFile);
File fileIndividuals = new File(MyOntologyWithIndividualsFile);
OWLOntology localOntology = null;
// Now load the local copy
try {
localOntology = manager.loadOntologyFromOntologyDocument(file);
localOntology = manager
.loadOntologyFromOntologyDocument(fileIndividuals);
} catch (OWLOntologyCreationException ex) {
ex.printStackTrace();
}
エラー:
org.semanticweb.owlapi.model.OWLOntologyAlreadyExistsException: Ontology already exists. OntologyID(OntologyIRI(<http://www.semanticweb.org/lp4220/ontologies/2014/4/untitled-ontology-35>))
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntology(OWLOntologyManagerImpl.java:880)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:806)
at uk.ac.manchester.cs.owl.owlapi.OWLOntologyManagerImpl.loadOntologyFromOntologyDocument(OWLOntologyManagerImpl.java:821)
アップデート:
結局のところ、オントロジーのマージは異なる IRI を持つものでのみ可能であり、したがって、オントロジーを同じ IRI を持つ 2 つに分割することは受け入れられないと思います。これに対する解決策 (Joshua のコメントによる) は、1 つのオントロジーからすべての個体と公理を読み取り、それらを既に読み込まれているオントロジーに追加することです。
個別の IRI のマージを伴うオントロジーの場合、次のように実行できます (例は Ignazio のOWLED 2011 スライド - スライド番号 27 を参照):
OWLOntologyManager m = create();
OWLOntology o1 = m.loadOntology(pizza_iri);
OWLOntology o2 = m.loadOntology(example_iri);
// Create our ontology merger
OWLOntologyMerger merger = new OWLOntologyMerger(m);
// Merge all of the loaded ontologies, specifying an IRI for the
new ontology
IRI mergedOntologyIRI =
IRI.create(
"http://www.semanticweb.com/mymergedont"
);
OWLOntology merged = merger.createMergedOntology(m,
mergedOntologyIRI);
assertTrue(merged.getAxiomCount() > o1.getAxiomCount());
assertTrue(merged.getAxiomCount() > o2.getAxiomCount());