简体   繁体   English

OWLAPI:想要使用HermiT推理器从本体中获得推断的公理

[英]OWLAPI : Want to get inferred axioms from ontology using HermiT reasoner

I want to get inferred axioms from reasoner [ HermiT ] along with its proper explanation. 我想从推理器[ HermiT ]得到推断的公理及其正确的解释。 I have following ontology created in protege. 我有以下本体创建的保护。

A.owl A.owl

<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
    <!ENTITY owl "http://www.w3.org/2002/07/owl#" >
    <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
    <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
    <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>
<rdf:RDF xmlns="http://www.semanticweb.org/ontologies/A#"
     xml:base="http://www.semanticweb.org/ontologies/A"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:owl="http://www.w3.org/2002/07/owl#"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
    <owl:Ontology rdf:about="http://www.semanticweb.org/ontologies/A"/>
    <!-- 
    ///////////////////////////////////////////////////////////////////////////////////////
    //
    // Classes
    //
    ///////////////////////////////////////////////////////////////////////////////////////
     -->
    <!-- http://www.semanticweb.org/ontologies/A#A -->
    <owl:Class rdf:about="http://www.semanticweb.org/ontologies/A#A">
        <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/ontologies/A#B"/>
    </owl:Class>
    <!-- http://www.semanticweb.org/ontologies/A#B -->
    <owl:Class rdf:about="http://www.semanticweb.org/ontologies/A#B">
        <owl:equivalentClass rdf:resource="http://www.semanticweb.org/ontologies/A#C"/>
    </owl:Class>
    <!-- http://www.semanticweb.org/ontologies/A#C -->
    <owl:Class rdf:about="http://www.semanticweb.org/ontologies/A#C"/>
</rdf:RDF>
<!-- Generated by the OWL API (version 3.5.1) http://owlapi.sourceforge.net -->

Following is my Java code :- 以下是我的Java代码 : -

//Some work done to load ontology
ReasonerFactory factory = new ReasonerFactory();
Reasoner reasoner = new Reasoner(reasonerConf, owlOntology);
BlackBoxExplanation explain = new BlackBoxExplanation(owlOntology, factory, reasoner);
HSTExplanationGenerator multiEx = new HSTExplanationGenerator(explain);
InferredSubClassAxiomGenerator gen = new InferredSubClassAxiomGenerator();
Set<OWLSubClassOfAxiom> subClass = gen.createAxioms(dataFactory, reasoner);
SatisfiabilityConverter converter = new SatisfiabilityConverter(dataFactory);
for (OWLSubClassOfAxiom ax : subClass) {
    System.out.println("\nAxiom :- " + ax);
    System.out.println("Is axiom entailed by reasoner ? :- " + reasoner.isEntailed(ax));
    System.out.println("Is axiom contained in ontology ? :- " + owlOntology.containsAxiom(ax));
    Set<Set<OWLAxiom>> expl = multiEx.getExplanations(converter.convert(ax));
    System.out.println("No. of Explanations :- " + expl.size());
    System.out.println("Explanation :- ");
    for (Set<OWLAxiom> a : expl) {
        System.out.println(a);
    }
}

According to my code here is the output :- 根据我的代码,这里是输出 : -

Axiom :- SubClassOf(<http://www.semanticweb.org/ontologies/A#B> owl:Thing)
Is axiom entailed by reasoner ? :- true
Is axiom contained in ontology ? :- false
No. of Explanations :- 1
Explanation :- 
[EquivalentClasses(<http://www.semanticweb.org/ontologies/A#B> <http://www.semanticweb.org/ontologies/A#C> )]

Axiom :- SubClassOf(<http://www.semanticweb.org/ontologies/A#C> owl:Thing)
Is axiom entailed by reasoner ? :- true
Is axiom contained in ontology ? :- false
No. of Explanations :- 1
Explanation :- 
[EquivalentClasses(<http://www.semanticweb.org/ontologies/A#B> <http://www.semanticweb.org/ontologies/A#C> )]

Axiom :- SubClassOf(<http://www.semanticweb.org/ontologies/A#A> <http://www.semanticweb.org/ontologies/A#B>)
Is axiom entailed by reasoner ? :- true
Is axiom contained in ontology ? :- true
No. of Explanations :- 1
Explanation :- 
[SubClassOf(<http://www.semanticweb.org/ontologies/A#A> <http://www.semanticweb.org/ontologies/A#B>)]

Axiom :- SubClassOf(<http://www.semanticweb.org/ontologies/A#A> <http://www.semanticweb.org/ontologies/A#C>)
Is axiom entailed by reasoner ? :- true
Is axiom contained in ontology ? :- false
No. of Explanations :- 1
Explanation :- 
[EquivalentClasses(<http://www.semanticweb.org/ontologies/A#B> <http://www.semanticweb.org/ontologies/A#C> ), SubClassOf(<http://www.semanticweb.org/ontologies/A#A> <http://www.semanticweb.org/ontologies/A#B>)]

I have following questions : 我有以下问题:

1) Is this code sufficient to get inferred axioms ? 1)此代码是否足以得出推断的公理? (Like I can check whether new axiom is available inside original ontology, if no then its an inferred axiom - [Take care of axioms saying C SubClassOf owl:Thing ]) (就像我可以检查原始本体中是否有新的公理可用,如果没有那么它是推断的公理 - [照顾公理说C SubClassOf owl:Thing ])

2) What is the use of reasoner's isEntailed() method if its giving true always ? 2)推理器的isEntailed()方法有什么用?如果它总是给出true

3) There is always 1 explanation for inferred axiom. 3)推断公理总有一种解释。 Is it correct ? 这是正确的吗 ? For inferred axiom A SubClassOf C , has 1 explanation but its Set is opposite (order-wise) of what has shown in protege. 对于推断的公理A SubClassOf C ,有1个解释,但其Set与protege中显示的相反(顺序)。 So I need to show it in reverse direction always ? 所以我需要反向展示它吗?

Protege image :- 保护图片 : -

<code> SubClassOf C </ code>的解释

1) yes it is sufficient - an axiom that's entailed and present in the ontology is usually called 'asserted'. 1)是的,它已经足够了 - 本体中所包含和存在的公理通常称为“断言”。

2) isEntailed() does not always return true. 2)isEntailed()并不总是返回true。 It does for the axioms you're using - try asking if owl:Thing is subclass if owl:Nothing. 它适用于你正在使用的公理 - 尝试询问owl:Thing是否为子类,如果owl:Nothing。

3) there is at least one explanation for an entailed axiom. 3)对于所包含的公理至少有一种解释。 When the axiom is contained in the ontology, it is the trivial explanation - all contained axioms are entailed. 当公理包含在本体中时,这是一个微不足道的解释 - 所有包含的公理都是必需的。 For more complex cases, multiple explanations are possible. 对于更复杂的情况,可以进行多种解释。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM