OWL API 改变公理中实体的 IRI
OWL API changing IRIs of entities in axioms
我正在使用 OWL API。我的问题是如何修改我的 OWLOntology 从文件中读取的所有 OWLAxiom 公理中所有实体的 IRI。例如,我想修改我的 ontology 中所有公理中的所有“http://xxx" to "http://yyy”。在这个ontology中选择的示例公理是:
SubClassOf(<http://xxx#A> <http://xxx#B>)
我需要接收例如:
SubClassOf(<http://yyy#A> <http://yyy#B>)
我的问题特别暗示要更改默认 IRI,因此,我尝试指定:
PrefixOWLOntologyFormat prefix = (PrefixOWLOntologyFormat) manager.getOntologyFormat(ontology);
prefix.setDefaultPrefix(...new...);
但它并没有改变公理中的 IRI。
一种解决方案是使用 OWLEntityRenamer class。
一种基本用法如下:
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>
我正在使用 OWL API。我的问题是如何修改我的 OWLOntology 从文件中读取的所有 OWLAxiom 公理中所有实体的 IRI。例如,我想修改我的 ontology 中所有公理中的所有“http://xxx" to "http://yyy”。在这个ontology中选择的示例公理是:
SubClassOf(<http://xxx#A> <http://xxx#B>)
我需要接收例如:
SubClassOf(<http://yyy#A> <http://yyy#B>)
我的问题特别暗示要更改默认 IRI,因此,我尝试指定:
PrefixOWLOntologyFormat prefix = (PrefixOWLOntologyFormat) manager.getOntologyFormat(ontology);
prefix.setDefaultPrefix(...new...);
但它并没有改变公理中的 IRI。
一种解决方案是使用 OWLEntityRenamer class。
一种基本用法如下:
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>