OWL API更改公理中实体的IRI

3
我正在使用OWL API。我的问题是如何修改我从文件读取的OWLOntology中所有OWLAxiom公理中所有实体的IRI。例如,我想将所有"http://xxx"修改为"http://yyy"。这个本体中所选的样例公理是:
SubClassOf(<http://xxx#A> <http://xxx#B>)

我需要收到例如以下的内容:
SubClassOf(<http://yyy#A> <http://yyy#B>)

我的问题特别是涉及到更改默认IRI,因此我尝试进行了说明:

PrefixOWLOntologyFormat prefix = (PrefixOWLOntologyFormat) manager.getOntologyFormat(ontology);
prefix.setDefaultPrefix(...new...);

但是它没有更改公理中的IRIs。


PrefixOWLOntologyFormat 是一个已经被弃用的类,你正在使用哪个版本? - Galigator
1个回答

4

一种解决方案是使用OWLEntityRenamer类。

一个基本的用法如下:

OWLEntityRenamer renamer = new OWLEntityRenamer(manager, Collections.singleton(ontology));
Map<OWLEntity, IRI> entity2IRIMap = new HashMap<>();
...
ont.applyChanges(renamer.changeIRI(entity2IRIMap));

您的Map<>所针对的所有个体都将被重命名。如果要按照某种模式重命名您的所有个体,则必须查询完整的个体列表以构建Map<>。

以下是使用OWLEntityRenamer的完整小例子:

    final OWLOntologyManager m = OWLManager.createOWLOntologyManager();
    final OWLOntology o = m.createOntology();

    o.add(OWL.classAssertion(OWL.Individual("xxx:1"), OWL.Class("b:y")));
    o.add(OWL.classAssertion(OWL.Individual("xxx:2"), OWL.Class("b:y")));
    o.add(OWL.classAssertion(OWL.Individual("xxx:3"), OWL.Class("b:y")));
    o.individualsInSignature().forEach(System.out::println);

    final OWLEntityRenamer renamer = new OWLEntityRenamer(m, Collections.singleton(o));
    final Map<OWLEntity, IRI> entity2IRIMap = new HashMap<>();

    o.individualsInSignature().forEach(toRename ->
    {
        final IRI iri = toRename.getIRI();
        entity2IRIMap.put(toRename, IRI.create(iri.toString().replaceFirst("xxx", "yyy")));
    });

    o.applyChanges(renamer.changeIRI(entity2IRIMap));
    o.individualsInSignature().forEach(System.out::println);

应该打印:

<xxx:3>
<xxx:2>
<xxx:1>
<yyy:3>
<yyy:2>
<yyy:1>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接