在OWLAPI中使用相同的IRI合并本体

时间:2014-07-17 17:34:27

标签: jena owl owl-api

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

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

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

  3. 因此,我需要合并这两个文件才能拥有完整的模型。我想知道如何使用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 slides - slide no. 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());
    

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

一般情况下,您不会制作个人和关系&#34;本体论,除非他们需要分类 - 比如定义Class&#34; American Company&#34;你需要一个个人&#34;美国&#34;。否则,那个其他部分应该是你的RDF三元组,它引用了本体论。