一致 OWL 本体中的解释

Explanations in Consistent OWL Ontologies

我想以编程方式获得对 一致 本体中推断公理的解释,其方式与 Protégé UI 中的方式类似。我找不到任何直接的方法。我找到了 owlapi 的 owlexplanation repo, but I cannot for the life of me solve the dependency issues to set up the owlexplanation environment. I have also browsed the javadoc 关于解释(为了完全避免其他回购),但是除了我已经看到的浏览 Java 源代码之外,我没有看到任何有用的东西。

我想过简单地否定推断的公理,通过不一致来获得解释,但我更喜欢更清晰的东西,而且我不确定这种方法是否正确。

其他(可能)有用的上下文:

如果有任何见解或提示,我将不胜感激。

2022 年 1 月 6 日更新:

我决定用干净的头脑再次尝试 owlexplanation 代码,所以这里是我的位置:

2022 年 1 月 8 日更新(尝试@Ignazio 的回答)

我创建了一个新的 IntelliJ 项目,并添加了 @Ignazio 提到的 Maven 依赖项(加上其他一些如 slf4j 等),我得到了一个工作示例(我认为)。转到我的主要项目(使用 JPype),我不得不手动下载一些 .jars 以包含在类路径中(因为这里不能使用 maven)。这些是目前下载的:

caffeine-3.0.5.jar         hppcrt-0.7.5.jar    org.semanticweb.hermit-1.4.5.519.jar  slf4j-api-1.7.32.jar
commons-rdf-api-0.5.0.jar  javax.inject-1.jar  owlapi-distribution-5.1.9.jar         slf4j-nop-1.7.32.jar
google-collect-1.0.jar     owlexplanation-5.0.0.jar

接下来,尝试使用 loadOntologyFromOntologyDocument() 时抛出 NullPointerException。我已尝试按照建议重新下载 jars here,但异常仍然存在。可能是缺少某些 .jar 文件?我根据会发生的抛出NoClassDefFoundError下载了它们。

这发生在一个普通的 pizza.owl 文件中,否则它可以正常工作。

EDIT:我使用 mvn dependency:copy-dependencies -DoutputDirectory=OUTPUT_DIR 获取依赖项并使用 OUTPUT_DIR 作为类路径,NullPointerException 消失了,所以看来我确实缺少一些 .jar 文件。

郑重声明,我随后遇到了其他问题(gen.getExplanations() 引发了 NoSuchMethodError 错误),但我没有更多时间调试它。我将放弃 JPype,无论它多么方便,只需使用 subprocess 从 Python 调用 Java。这些是(我猜)Jpype 问题,所以我接受 Ignazio 的回答,因为它解决了我的 Java/OWL API/owlexplanation 方面的问题。

您不仅在使用项目,而且实际上是从头开始构建它们,这比使用已发布的工件需要更多的设置。

使用 Maven 可用 jar 的快捷方式(通过 Maven Central,尽管其他 public 存储库也应该这样做)

Java代码:

    import java.io.File;
    import java.util.Set;
    import java.util.function.Supplier;
    
    import org.junit.Test;
    import org.semanticweb.HermiT.ReasonerFactory;
    import org.semanticweb.owl.explanation.api.Explanation;
    import org.semanticweb.owl.explanation.api.ExplanationGenerator;
    import org.semanticweb.owl.explanation.api.ExplanationGeneratorFactory;
    import org.semanticweb.owl.explanation.api.ExplanationProgressMonitor;
    import org.semanticweb.owl.explanation.impl.blackbox.Configuration;
    import org.semanticweb.owl.explanation.impl.blackbox.DivideAndConquerContractionStrategy;
    import org.semanticweb.owl.explanation.impl.blackbox.EntailmentCheckerFactory;
    import org.semanticweb.owl.explanation.impl.blackbox.InitialEntailmentCheckStrategy;
    import org.semanticweb.owl.explanation.impl.blackbox.StructuralTypePriorityExpansionStrategy;
    import org.semanticweb.owl.explanation.impl.blackbox.checker.BlackBoxExplanationGeneratorFactory;
    import org.semanticweb.owl.explanation.impl.blackbox.checker.SatisfiabilityEntailmentCheckerFactory;
    import org.semanticweb.owlapi.apibinding.OWLManager;
    import org.semanticweb.owlapi.model.OWLAxiom;
    import org.semanticweb.owlapi.model.OWLOntology;
    import org.semanticweb.owlapi.model.OWLOntologyManager;
    import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
    
    public class CheckOntology {
    
        @Test
        public void should() throws Exception {
    
            OWLOntologyManager m = OWLManager.createOWLOntologyManager();
            OWLOntology o = m.loadOntologyFromOntologyDocument(new File("pizza.owl"));
    
            OWLReasonerFactory rf = new ReasonerFactory(); // Get hold of a reasoner factory
    
            // Create the explanation generator factory which uses reasoners provided by the specified
            // reasoner factory
    
            ExplanationGeneratorFactory<OWLAxiom> genFac =
                createExplanationGeneratorFactory(rf, null, OWLManager::createOWLOntologyManager);
    
            // Now create the actual explanation generator for our ontology
            ExplanationGenerator<OWLAxiom> gen = genFac.createExplanationGenerator(o);
    
    
            // Ask for explanations for some entailment
            // Get a reference to the axiom that represents the entailment that we want explanation for
            
            // this will just run the explanations for all axioms
            o.logicalAxioms().forEach(e -> explain(e, gen));
        }
    
        void explain(OWLAxiom entailment, ExplanationGenerator<OWLAxiom> gen) {
            // Get our explanations. Ask for a maximum of 5.
            try {
                Set<Explanation<OWLAxiom>> expl = gen.getExplanations(entailment, 5);
                System.out.println("CheckOntology.explain() " + entailment);
                expl.forEach(System.out::println);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    // 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);
        }
    }

Maven 配置:

4.0.0 废话 废话 0.0.1-快照 废话 联机 联机 4.12 net.sourceforge.owlapi org.semanticweb.hermit 1.4.5.519 net.sourceforge.owlapi 猫头鹰解释 5.0.0

HermiT 可以通过我制作的发布版本在 Maven Central 上获得——补丁版本指的是它构建时使用的 OWLAPI 版本。这里 1.4.5.519 表示 HermiT 是用 OWLAPI 5.1.9 构建的。 owlexplanation 5.0.0 是使用 OWLAPI 5 构建的,因此它与项目的主要 OWLAPI 版本相同。

此代码示例并没有做很多事情,因为它只是寻找对断言公理的解释。通常,解释只是公理本身,正如它所断言的那样。改变所选择的公理,或使用 ontology 中未声明的公理,应该会给你想要的解释。