使用OWLAPI将类子层次结构合并到另一个本体

使用OWLAPI将类子层次结构合并到另一个本体,owl,owl-api,Owl,Owl Api,我有两个本体论,称为本体论A和本体论B,两个本体论中都没有任何个体。简单地说,我需要在本体a中获得一个概念C1及其子概念(概念的子层次结构),并将其合并到本体B中的一个概念。在OWL API中有没有一种简单的方法来实现这一点,或者我必须从头开始编写这个逻辑 我已经研究了一些其他相关的问题,但它们没有包含我需要的内容。Protege只包含合并两个本体的选项,这不是我的要求()。我发现的这个关于合并本体的问题也会合并完整的本体()。我想要的是将本体的一部分合并到另一部分 非常简单,在OWLAPI中是

我有两个本体论,称为本体论A和本体论B,两个本体论中都没有任何个体。简单地说,我需要在本体a中获得一个概念C1及其子概念(概念的子层次结构),并将其合并到本体B中的一个概念。在OWL API中有没有一种简单的方法来实现这一点,或者我必须从头开始编写这个逻辑

我已经研究了一些其他相关的问题,但它们没有包含我需要的内容。Protege只包含合并两个本体的选项,这不是我的要求()。我发现的这个关于合并本体的问题也会合并完整的本体()。我想要的是将本体的一部分合并到另一部分

非常简单,在OWLAPI中是否有一种简单的方法可以将本体的一部分(概念的子层次)合并到另一个本体


提前感谢。

这个问题看似简单,但在编写代码之前,需要明确一些重要的约束条件

本体中只有命名类和命名类之间的子类公理的子层次结构非常简单:

A subclassOf B
C subclassOf B
B
的子层次结构完全由这两个公理描述,因此您可以选择它们并轻松复制:

OWLOntology source = ...
OWLOntology destination = ...
OWLClass a = ...

source.subClassAxiomsForSuperClass(a).forEach(destination::addAxiom);
// repeat on the subclass in each axiom recursively
但是,如果存在匿名类,问题会很快变得更复杂:

A subclassOf exist r D
exist r D subclassOf B
C subclassOf B
如果有必要保留所有推论以及断言的层次结构(例如,上面示例中显示的GCI),则选择要复制到目标本体的公理集变得非常复杂。 有很多关于模块化和原子分解的文献,这两个研究领域都涵盖了选择公理的主题,公理允许所有引用初始签名的推论——在本例中,是您的起始类

您可以使用
SyntacticLocalityModuleExtractor
获取公理集:

destination.addAxioms(new SyntacticLocalityModuleExtractor(
        source.getOWLOntologyManager(), 
        source, 
        ModuleType.STAR));
但是,您应该阅读文献中的相关文章,以了解可用方法的优点和局限性。一些出发点:


从概念开始递归地获取子类公理,并将其添加到另一个本体中-是的,很简单,大约10行Java代码感谢@AKSW的回答。我对owl api是新手,我认为除了编写简单的逻辑之外,owl api中可能还有一些简单的方法。好吧,至少我不知道像e
getSubclass层次结构(OWLClass根)
-但正如我所说,它的实现非常简单。如果您对它有任何问题,请在这里随意询问。不,任何内容都不会自动更改。OWL基于公理,它本身引用URI标识的实体。如果您将公理从本体1复制到本体2,您仍然会在本体1中使用URI。如果您不想这样做,您必须“我必须重命名这些类,这意味着您必须用新的URI重新创建子类公理。@AKSW,我明白了。我也明白您所说的。我只需要将相关公理转移到另一个本体中。谢谢您的时间。”。