1

我想以编程方式在一致的本体中获得对推断公理的解释,就像在 Protégé UI 中可以做的那样。我找不到任何直接的方法。我找到了owlexplanation repo,但我无法终生解决依赖问题来设置owlexplanation环境。我还浏览了有关解释的 owlapi 的javadoc(以完全避免其他 repo),但除了浏览 Java 源代码已经看到的内容之外,我没有看到任何有用的东西。

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

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

  • 几年前我使用过一些 Java,但我现在主要使用 Python(我尝试将 OWL API 与 JPype 一起使用,而 OWL 通常与 Owlready2 一起使用)。
  • 我正在使用 HermiT 推理器(再次通过 JPype)(根据 build.xml 文件,最新稳定版本 1.3.8)。
  • 我已经设法从 HermiT 源代码中获得了对我的设置中的不可满足性和不一致的解释,而没有owlexplanation遵循这个示例。
  • 我掉进了兔子洞,想要制作一个可用的.jar文件owlexplanation,以便将它添加到我的 JPype 类路径中。当我一开始无法构建 Java 项目时,我的计划就落空了。
  • 我正在使用 Intellij IDE。

我将不胜感激任何见解或提示。

2022 年 1 月 6 日更新:

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

  • 从 github 下载源代码并解压缩 zip。
  • 启动 IntelliJ,而不是从“从现有源创建项目”,我单击“打开”并选择提取的目录。
  • 我建立了这个项目,它成功了。
  • 从 Maven 工具中,我成功运行干净、验证、编译和测试。
  • 如果我运行“包”Maven 操作,它会抛出“环境变量 JAVA_HOME 未正确设置”的错误。问题是,如果我去 File>Project Structure,我看到 SDK 设置为 11,它不是空的。
  • 此外,从pom.xml文件中我得到这些问题:
    • Plugin 'org.apache.maven.plugins:maven-gpg-plugin:1.5' not found
    • Plugin 'org.sonatype.plugins:nexus-staging-maven-plugin:1.6.6' not found

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

我创建了一个新的 IntelliJ 项目,并添加了 @Ignazio 提到的 Maven 依赖项(加上其他一些类似slf4j等),我得到了一个工作示例(我认为)。转到我的主要项目(使用 JPype),我必须手动下载一些 .jar 以包含在类路径中(因为这里不能使用 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

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

这发生在一个pizza.owl可以正常工作的通用文件中。

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

作为记录,然后我遇到了其他问题(gen.getExplanations()抛出NoSuchMethodError错误),但我没有更多时间来调试它。我将抛弃 JPype,不管它多么方便,只需从 Python 中调用 Java,使用subprocess. 这些是(我猜)Jpype 问题,所以我接受 Ignazio 的回答,因为它解决了我的 Java/OWL API/owlexplanation 方面的问题。

4

1 回答 1

1

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

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

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-SNAPSHOT 等等 junit junit 4.12 net.sourceforge.owlapi org.semanticweb.hermit 1.4.5.519 net.sourceforge.owlapi owlexplanation 5.0.0

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

这个代码示例并没有做很多事情,因为它只是寻找对断言公理的解释。通常,解释只是公理本身,正如它所断言的那样。改变选择的公理,或者使用本体中没有断言的公理,应该会给你你所追求的解释。

于 2022-01-07T20:52:55.770 回答