2017-09-05 126 views
1

我正在使用OWL API。我的问题是,如何修改从我的OWLOntology文件中读取的所有OWLAxiom公理中所有实体的IRI。例如,我想在我的本体论的所有公理中将所有“http://xxx”修改为“http://yyy”。在这种本体论所选择的例子公理是:OWL API更改公理中实体的IRI

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。

+0

PrefixOWLOntologyFormat不赞成使用类,您使用的是什么版本? – Galigator

回答

2

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

一个基本用法是下列之一:

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

通过在地图<针对性的所有个人>将重新命名。 如果你想通过一种模式重新命名你的个人,你必须查询你的个人完成列表来建立地图<>。

这里使用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>