一致 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 源代码之外,我没有看到任何有用的东西。
我想过简单地否定推断的公理,通过不一致来获得解释,但我更喜欢更清晰的东西,而且我不确定这种方法是否正确。
其他(可能)有用的上下文:
- 我在 Java 年前使用过一些,但我现在主要使用 Python(我尝试将 OWL API 与 JPype 和 OWL通常与 Owlready2).
- 我正在使用 HermiT reasoner(再次通过 JPype)(根据 build.xml 文件,
最新稳定 版本 1.3.8)。
- 在没有
owlexplanation
的情况下,我已经成功地得到了我的设置中的不满意和不一致的解释,遵循 HermiT 源代码中的 this 示例。
- 我陷入了困境,想要为
owlexplanation
创建一个可用的 .jar
文件,以便将其添加到我的 JPype 类路径中。当我一开始无法构建 Java 项目时,我的计划就打乱了。
- 我正在使用 Intellij IDE。
如果有任何见解或提示,我将不胜感激。
2022 年 1 月 6 日更新:
我决定用干净的头脑再次尝试 owlexplanation
代码,所以这里是我的位置:
- 从 github 下载了源代码并解压缩了 zip。
- 启动 IntelliJ 而不是从“从现有源创建项目”,我单击“打开”并选择提取的目录。
- 我构建了项目并且它成功了。
- 通过 Maven 工具,我 运行 成功清理、验证、编译和测试。
- 如果我 运行“打包”Maven 操作,它会抛出“环境变量 JAVA_HOME 未正确设置”的错误。问题是,如果我转到“文件”>“项目结构”,我会看到 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),我不得不手动下载一些 .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 中未声明的公理,应该会给你想要的解释。
我想以编程方式获得对 一致 本体中推断公理的解释,其方式与 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 源代码之外,我没有看到任何有用的东西。
我想过简单地否定推断的公理,通过不一致来获得解释,但我更喜欢更清晰的东西,而且我不确定这种方法是否正确。
其他(可能)有用的上下文:
- 我在 Java 年前使用过一些,但我现在主要使用 Python(我尝试将 OWL API 与 JPype 和 OWL通常与 Owlready2).
- 我正在使用 HermiT reasoner(再次通过 JPype)(根据 build.xml 文件,
最新稳定版本 1.3.8)。 - 在没有
owlexplanation
的情况下,我已经成功地得到了我的设置中的不满意和不一致的解释,遵循 HermiT 源代码中的 this 示例。 - 我陷入了困境,想要为
owlexplanation
创建一个可用的.jar
文件,以便将其添加到我的 JPype 类路径中。当我一开始无法构建 Java 项目时,我的计划就打乱了。 - 我正在使用 Intellij IDE。
如果有任何见解或提示,我将不胜感激。
2022 年 1 月 6 日更新:
我决定用干净的头脑再次尝试 owlexplanation
代码,所以这里是我的位置:
- 从 github 下载了源代码并解压缩了 zip。
- 启动 IntelliJ 而不是从“从现有源创建项目”,我单击“打开”并选择提取的目录。
- 我构建了项目并且它成功了。
- 通过 Maven 工具,我 运行 成功清理、验证、编译和测试。
- 如果我 运行“打包”Maven 操作,它会抛出“环境变量 JAVA_HOME 未正确设置”的错误。问题是,如果我转到“文件”>“项目结构”,我会看到 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),我不得不手动下载一些 .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 中未声明的公理,应该会给你想要的解释。