2017-09-05 9 views
1

OWL APIを使用しています。私の質問は、ファイルから読み込んだOWLOntology内のすべてのOWLAxiom公理のすべてのエンティティのIRIをどのように変更できるかです。たとえば、私のオントロジ内のすべての公理で、すべて "http://xxx"を "http://yyy"に変更したいとします。このオントロジーで選択された例の公理は次のとおりです。OWL APIは公理のエンティティのIRIを変更します

SubClassOf(<http://xxx#A> <http://xxx#B>) 

は私が受信する必要がある例:

PrefixOWLOntologyFormat prefix = (PrefixOWLOntologyFormat) manager.getOntologyFormat(ontology); 
prefix.setDefaultPrefix(...new...); 
:私の質問は、特にデフォルトIRIを変更する意味

は、それゆえ、私は指定しようとした

SubClassOf(<http://yyy#A> <http://yyy#B>) 

しかし、公理ではIRIは変更されませんでした。

+0

PrefixOWLOntologyFormatは非推奨クラスであるが、あなたはどのバージョンを使用していますか? – Galigator

答えて

2

解決策の1つは、OWLEntityRenamerクラスを使用することです。

1つの基本的な使い方は、次のいずれかです。

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

あなたの地図<の対象となるすべての人>名前を変更します。 あなたのすべてをパターンで個別に名前を変更する場合は、個人の完全なリストを照会して、マップ<>を構築する必要があります。

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); 

を印刷する必要があります:ここでOWLEntityRenamer使用して完全な小さな例

<xxx:3> 
<xxx:2> 
<xxx:1> 
<yyy:3> 
<yyy:2> 
<yyy:1> 
関連する問題