Laconic Explanations in OWLAPI

110 Views Asked by At

I am using OWLAPI to get all the inferred axioms and their explanations, for some ontologies. For the explanations, I need to get the explanation with the minimal set of axioms for each inferred axiom (laconic explanation), but I can't figure out how to do it, and I don't see any mention of laconic in the owlapi docs (http://owlcs.github.io/owlapi/apidocs_5/index.html).

Is there a way to get the laconic explanations for an inferred axiom in OWLAPI? If so, is it possible to give me an example of how I can achieve this?

UPDATE: Following the advice given in comments, I changed my code to:

public static void explain(OWLAxiom entailment, ExplanationGenerator<OWLAxiom> explanation_generator) {
     try {
        Set<Explanation<OWLAxiom>> explanations = 
                          explanation_generator.getExplanations(entailment, 1);
        explanations.forEach(System.out::println);
        System.out.println("EndOfExplanation\n");
     } catch (Exception e) {
        System.out.println(e);
     }
};


// This method replicates code existing in the owlexplanation project; 
// it's needed because the factories in owlexplanation do not set InitialEntailmentCheckStrategy correctly
public static ExplanationGeneratorFactory<OWLAxiom> createExplanationGeneratorFactory(
       OWLReasonerFactory reasonerFactory, ExplanationProgressMonitor<OWLAxiom> progressMonitor,
            Supplier<OWLOntologyManager> m) {
    EntailmentCheckerFactory<OWLAxiom> checker = new SatisfiabilityEntailmentCheckerFactory(reasonerFactory, m);
    Configuration<OWLAxiom> config = new Configuration<>(checker, 
    new StructuralTypePriorityExpansionStrategy<OWLAxiom>(InitialEntailmentCheckStrategy.PERFORM, m),
    new DivideAndConquerContractionStrategy<OWLAxiom>(), progressMonitor, m);
    return new BlackBoxExplanationGeneratorFactory<>(config);
};


public static void main(String[] args) {
    ...
     ExplanationGeneratorFactory<OWLAxiom> genFac = 
       ExplanationManager.createLaconicExplanationGeneratorFactory(
                 reasoner_factory, OWLManager::createOWLOntologyManager);
     ExplanationGenerator<OWLAxiom> gen = genFac.createExplanationGenerator(onto);
     inferred_axioms_onto.logicalAxioms().forEach(e -> explain(e, gen));
}

but I still get java.lang.NullPointerException which is caused in the line Set<Explanation<OWLAxiom>> explanations = explanation_generator.getExplanations(entailment, 1);.

The error stack trace is:

at org.semanticweb.owl.explanation.impl.blackbox.StructuralTypePriorityExpansionStrategy.doExpansion(StructuralTypePriorityExpansionStrategy.java:69)
    at org.semanticweb.owl.explanation.impl.blackbox.BlackBoxExplanationGenerator2.doExpansion(BlackBoxExplanationGenerator2.java:262)
    at org.semanticweb.owl.explanation.impl.blackbox.BlackBoxExplanationGenerator2.computeExplanation(BlackBoxExplanationGenerator2.java:183)
    at org.semanticweb.owl.explanation.impl.blackbox.BlackBoxExplanationGenerator2.generateExplanation(BlackBoxExplanationGenerator2.java:292)
    at org.semanticweb.owl.explanation.impl.blackbox.hst.HittingSetTree.buildHittingSetTree(HittingSetTree.java:110)
    at org.semanticweb.owl.explanation.impl.blackbox.BlackBoxExplanationGenerator2.getExplanations(BlackBoxExplanationGenerator2.java:118)
    at org.semanticweb.owl.explanation.impl.blackbox.BlackBoxExplanationGenerator2.getExplanations(BlackBoxExplanationGenerator2.java:94)
    at org.semanticweb.owl.explanation.impl.laconic.LaconicExplanationGenerator.computePreciseJustsOptimised(LaconicExplanationGenerator.java:173)
    at org.semanticweb.owl.explanation.impl.laconic.LaconicExplanationGenerator.getExplanations(LaconicExplanationGenerator.java:386)
    at msc.Explainer.explain(Explainer.java:46)
    at msc.Explainer.lambda$2(Explainer.java:132)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:270)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Iterator.forEachRemaining(Iterator.java:116)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at msc.Explainer.main(Explainer.java:132)

I have taken the ExplanationGenerationFactory function from this answer on getting explanations: Explanations in Consistent OWL Ontologies, as without it I couldn't get explanations at all.

0

There are 0 best solutions below