【问题标题】:How to properly merge 2 ontologies with OWL API 4 or 3.5如何正确地将 2 个本体与 OWL API 4 或 3.5 合并
【发布时间】:2015-09-02 12:04:58
【问题描述】:

在我的硕士论文项目中,我想合并几个具有不同命名空间的本体(仅填充个人),但共享相同的导入和一些个人(例如 ontologyA#Harold 和 ontologyB#Harold)。

我正在尝试获得一个新的合并本体,其中:

  1. 保留了 2 个本体的本体标头信息(如在 Protege 5 中使用 OWL API 3.5.1)。
  2. 来自合并本体的个体被“合并”,尽管它们的命名空间不同
  3. 合并后的本体只有 1 个命名空间

我的合并代码

private ArrayList<Ontology> ontologies;
    private OWLOntologyManager man;
    private OWLOntologyMerger merger;
    private String fileName;
    private OWLOntology mergedOntology;

public Merger(ArrayList<Ontology> ontologies, OWLOntologyManager man, String filename){

        this.ontologies = ontologies;
        this.man = man;
        this.fileName = filename;
        //create the OWL Ontology merger which retrievs all loaded ontology from manager
        merger = new OWLOntologyMerger(man);    
        //call the merging process
        mergeOntologies();
    }

private void mergeOntologies(){
        IRI mergedOntologyIRI = IRI.create("http://semanticweb.org/ontology/" + fileName);
        for(Ontology ontology : ontologies){
            try {

                man.loadOntologyFromOntologyDocument(ontology.getFile());

            } catch (OWLOntologyCreationException e) {
                e.printStackTrace();
            }
        }
        try {
            mergedOntology = merger.createMergedOntology(man, mergedOntologyIRI);
        } catch (OWLOntologyCreationException e) {
            e.printStackTrace();
        }   
    }

到目前为止,我只能归档本体中个体的简单文本合并。在 Protege 上,本体标头也被合并,但没有与我的代码合并。

据我了解,我无法合并具有相同命名空间的 2 个本体,OWLOntologyManager 将引发异常。因此,这不是一个选择。

如何实现本体的“智能”合并? 我做错了什么? 有代码示例吗?


回应伊格纳齐奥: 使用本体标题我的意思是:

<owl:Ontology rdf:about="http://semanticweb.org/ontologies/Harold/Structural_Context">
        <structure:modeltype>Structural Context</structure:modeltype>
        <structure:modelname>Harold</structure:modelname>
        <structure:adoversion>Version 1.0 4.0</structure:adoversion>
        <structure:date>07.01.2015</structure:date>
        <structure:time>17:49</structure:time>
        <structure:username>alex</structure:username>
        <owl:imports rdf:resource="http://MyServer/HCML/structure"/>
    </owl:Ontology>

Ontology A 的个体 Harold 长这样:

<owl:NamedIndividual rdf:about="http://semanticweb.org/ontologies/Harold/Structural_Context#Harold">
        <rdf:type rdf:resource="http://MyServer/HCML/structure#Object"/>
    </owl:NamedIndividual>

本体 B 的个体 Harold 长这样:

<owl:NamedIndividual rdf:about="http://semanticweb.org/ontologies/evening_activity/User_Context#Harold">
        <rdf:type rdf:resource="http://MyServer/HCML/structure#Person"/>
        <structure:connection rdf:resource="http://semanticweb.org/ontologies/evening_activity/User_Context#bedroom"/>
        <structure:calling rdf:resource="http://semanticweb.org/ontologies/evening_activity/User_Context#enter_the_living_room"/>
        <structure:executing rdf:resource="http://semanticweb.org/ontologies/evening_activity/User_Context#enter_the_living_room"/>
        <structure:participating rdf:resource="http://semanticweb.org/ontologies/evening_activity/User_Context#enter_the_living_room"/>
    </owl:NamedIndividual>

添加公理:

IRI mergedOntologyIRI = IRI.create("http://semanticweb.org/ontology/" + fileName);
        Set<OWLAxiom> axioms = new HashSet<OWLAxiom>();
        for(Ontology ontology : ontologies){
                man.loadOntologyFromOntologyDocument(ontology.getFile());
                axioms.addAll(ontology.getOntology().getAxioms());
                man.removeOntology(ontology.getOntology());
        }
            mergedOntology = man.createOntology(mergedOntologyIRI);
            man.addAxioms(mergedOntology, axioms);

结果与使用 OWLOntologyMerger 相同。

手动合并公理、导入和使用 OWLEntityRenamer 我可以获得很好的合并结果。

代码如下:

private void mergeOntologies(){
IRI mergedOntologyIRI = IRI.create("http://semanticweb.org/ontology/" + fileName);
    //Using HashSet to avoid duplicated entries
    Set<OWLAxiom> axioms = new HashSet<OWLAxiom>();
    Set<OWLImportsDeclaration> imports = new HashSet<OWLImportsDeclaration>();
    try{    
        for(Ontology ontology : ontologies){
            man.loadOntologyFromOntologyDocument(ontology.getFile());
            axioms.addAll(ontology.getOntology().getAxioms());
            imports.addAll(ontology.getOntology().getImportsDeclarations());
            man.removeOntology(ontology.getOntology()); 
        } 
        mergedOntology = man.createOntology(mergedOntologyIRI);
        man.addAxioms(mergedOntology, axioms);
    } catch (OWLOntologyCreationException e) {
        e.printStackTrace();
    } 
    //Adding the import declarations
    for(OWLImportsDeclaration decl : imports){
        man.applyChange(new AddImport(mergedOntology, decl));
    }
    //rename individuals names to use the merged ontology's IRI
    renameIRIs(mergedOntologyIRI);
}

  private void renameIRIs (IRI newIRI){
        OWLEntityRenamer renamer = new OWLEntityRenamer(man, man.getOntologies());

        for(Ontology ontology : ontologies){
            for ( OWLEntity individual : ontology.getOntology().getIndividualsInSignature()){
                //replace the individual's old IRI with the new one E.g: http://ontologyOld#name becomes newIRI#name
                IRI individualName = IRI.create(individual.getIRI().toString().replaceFirst("[^*]+(?=#|;)", newIRI.toString()));
                man.applyChanges(renamer.changeIRI(individual.getIRI(), individualName));
            }
        }   
    }

【问题讨论】:

    标签: java merge ontology owl-api


    【解决方案1】:

    本体的命名空间不是问题 - 问题是当本体具有相同的本体 id 时。在这种情况下,它们不能合并到同一个管理器中 - 管理器需要关系 ontologyID-&gt;ontology 才能正常工作。为了能够为新的本体使用相同的本体 ID,它必须由单独的管理器管理。

    请注意,本体 IRI 并不规定其中包含的各个名称的命名空间;解析后,各个 IRI 独立于本体,公理可以毫无问题地移至其他本体。

    您能描述一下本体标头的含义吗?

    本体公理本身可以通过多种方式合并;我能想到的最简单的方法是将两个本体中的所有公理添加到一个集合中,然后使用该集合创建一个新的本体。

    【讨论】:

    • 我不能使用使用多个管理器的策略,因为我的应用程序将用于合并10-30个本体文件。这么多管理器的初始化需要时间。
    • 好的,在这种情况下,我会将所有本体中的所有公理添加到一个集合中,然后从该集合中创建一个新的本体。
    • 我仍然不明白为什么 Ontology IRI 对个人的命名空间不是强制性的。你能用一个例子向我解释一下吗?我尝试将公理添加到新的本体中,但个体仍在其先前的命名空间中。我将尝试为个人使用相对标识符。
    • 本体 iri 不是强制性的原因是命名的类或个体的命名与使用位置无关 - 如果不是这种情况,就不可能跨本体重用实体。如果您想重命名实体,请查看 OWLEntityRenamer。不要使用相对虹膜,因为它们只对解析前的 rdf/XML 有意义
    • 感谢您的提示。我设法收集所有公理和导入,同时更改实体名称。不幸的是,一些公理丢失了它们的类型描述并成为注释。我会试着找出原因,你有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2017-11-14
    • 2021-05-22
    • 2015-10-31
    • 1970-01-01
    • 2020-04-27
    • 2019-07-21
    相关资源
    最近更新 更多