2

我通常将我的本体保存在两个不同的文件中。

  1. 第一个本体文件包含类、子类、数据属性和对象属性。

  2. 第二个文件包含所有个人和个人之间的关系。

所以,我需要合并这两个文件才能有一个完整的模型。我想知道如何使用 owlapi 来实现这一点?

在耶拿,我这样做如下:

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 的本体分成两个是不可接受的。对此的解决方案(正如 Joshua 所评论的)可能是从一个本体中读取所有个体和公理,然后将它们添加到已经加载的本体中。

对于具有不同 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());
4

2 回答 2

2

您的问题是数据中没有相同的 iri,而是在同一个管理器中加载了相同 iris 的本体。将本体加载到单独的管理器中,并将所有公理从一个添加到另一个,这将为您提供一个合并的本体。

于 2014-07-18T14:20:49.813 回答
0

一般来说,您不会将“个人和关系”作为本体,除非它们需要分类 - 例如定义“美国公司”类,您需要一个“美国”。否则,其他部分应该是引用本体的 RDF 三元组。

于 2014-07-18T23:12:22.413 回答