英文:
How to generate specific inference using owlapi?
问题
I am working on this project which requires to perform ontology reasoning in code, so far I have written this rule. I am implementing this in java with the help of owlapi, and clarkparsia.pellet.owlapiv3.PelletReasoner.
//dexpi:Pump(?pump) ^ swrlb:greaterThan(?value, "10.0"^^xsd:double) ^ rdl:datumValue(?pump, ?value) -> dexpi:EjectorPump(?pump)
// Rule created using SWRLClassAtoms and DataPropertyAtoms
ontologyManager.applyChange(new AddAxiom(ontology, rule1));
So this section of code adds the rule to the ontology. I know the rules are defined correctly, since I can see this rule in protege, but How do I update the ontology according to the rule, i.e. change class type of all Pump instances whose datumValue is greaterThan 10 to EjectorPump.
I have tried these approaches so far.
Approach-1
// These lines uses pellet reasoner to perform reasoning
PelletReasoner reasoner = PelletReasonerFactory.getInstance().createReasoner(ontology);
InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner);
iog.fillOntology(factory, ontology);
Approach-2
List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<>();
gens.add(new InferredClassAssertionAxiomGenerator());
InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner, gens);
iog.fillOntology(factory, ontology);
Both of the approaches works perfectly fine but the problem is when they generate inference there is too much information I just want reclassification to be done like this if possible (This one is generated by protege.
desired inference (generated by protege)
but instead, these codes reclassify like this
code generated inference
Additionally, if you can direct me on how I can generate and show an explanation of reasoning, it will be a huge help. Thank you.
英文:
I am working on this project which requires to perform ontology reasoning in code, so far I have written this rule. I am implementing this in java with the help of owlapi, and clarkparsia.pellet.owlapiv3.PelletReasoner.
//dexpi:Pump(?pump) ^ swrlb:greaterThan(?value, "10.0"^^xsd:double) ^ rdl:datumValue(?pump, ?value) -> dexpi:EjectorPump(?pump)
// Rule created using SWRLClassAtoms and DataPropertyAtoms
ontologyManager.applyChange(new AddAxiom(ontology, rule1));
So this section of code adds the rule to the ontology. I know the rules are defined correctly, since I can see this rule in protege, but How do I update the ontology according to the rule, i.e. change class type of all Pump instances whose datumValue is greaterThan 10 to EjectorPump.
I have tried these approaches so far.
Approach-1
// These lines uses pellet reasoner to perform reasoning
PelletReasoner reasoner = PelletReasonerFactory.getInstance().createReasoner(ontology);
InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner);
iog.fillOntology(factory, ontology);
Approach-2
List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<>();
gens.add(new InferredClassAssertionAxiomGenerator());
InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner, gens);
iog.fillOntology(factory, ontology);
Both of the approaches works perfectly fine but the problem is when they generate inference there is too much information I just want reclassification to be done like this if possible (This one is generated by protege.
desired inference (generated by protege)
but instead, these codes reclassify like this
code generated inference
Additionally, if you can direct me on how I can generate and show an explanation of reasoning, it will be a huge help. Thank you.
答案1
得分: 0
以下是翻译好的部分:
从上面的评论中延伸讨论:
Openllet 和 OWLAPI 版本:Openllet 的 2.6.5 版本是三年前发布的,我刚刚尝试了它与 OWLAPI 5.1.20(一年半前发布)的配合,没有收到任何错误。然而,我没有您的本体,所以这可能不是足够的测试。
无论使用哪种设置,您都可以通过编写自己的生成器来更有选择地生成公理。此示例引入了一个仅为一个类创建断言公理的生成器,即它不会为个体添加任何其他类型:
List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<>();
gens.add(new InferredEntityAxiomGenerator<OWLClass, OWLClassAssertionAxiom>() {
@Override
protected Stream<OWLClass> getEntities(OWLOntology ont) {
return Stream.of(factory.getOWLClass(IRI.create("urn:test:onto#A")));
}
@Override
protected void addAxioms(OWLClass entity, OWLReasoner reasoner, OWLDataFactory dataFactory,
Set<OWLClassAssertionAxiom> result) {
reasoner.getInstances(entity).entities().map(x -> factory.getOWLClassAssertionAxiom(entity, x))
.forEach(result::add);
}
@Override
public String getLabel() {
// TODO Auto-generated method stub
return "Instances of A";
}
});
InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner, gens);
iog.fillOntology(factory, ontology);
这种方法可以用于较旧的 OWLAPI 版本,但您需要调整它以正确编译使用您所使用的版本。
英文:
Extending the discussion from the comments above:
Openllet and OWLAPI versions: 2.6.5 of Openllet was released three years back, I have just tried it with OWLAPI 5.1.20 (released a year and a half ago) and got no errors. However, I do not have your ontology, so this might not be a sufficient test.
With either setup, you can be more selective about which axioms to generate by writing your own generator. This example introduces a generator that creates assertion axioms for only one class, i.e., it will not add any other type to individuals:
List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<>();
gens.add(new InferredEntityAxiomGenerator<OWLClass, OWLClassAssertionAxiom>() {
@Override
protected Stream<OWLClass> getEntities(OWLOntology ont) {
return Stream.of(factory.getOWLClass(IRI.create("urn:test:onto#A")));
}
@Override
protected void addAxioms(OWLClass entity, OWLReasoner reasoner, OWLDataFactory dataFactory,
Set<OWLClassAssertionAxiom> result) {
reasoner.getInstances(entity).entities().map(x -> factory.getOWLClassAssertionAxiom(entity, x))
.forEach(result::add);
}
@Override
public String getLabel() {
// TODO Auto-generated method stub
return "Instances of A";
}
});
InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner, gens);
iog.fillOntology(factory, ontology);
The approach can be followed for older OWLAPI versions, but you will have to adjust it to compile correctly with whichever version you're using.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论