2017-09-05 4 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

한 가지 해결책은 OWLEntityRenamer 클래스를 사용하는 것입니다.

하나의 기본적인 사용법은 다음 중 하나입니다 : 당신의지도 <의 대상

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>