关于OWL API推理器类型与物化冗余断言的技术问询
1. 代码中调用的推理器类型
你代码里的new ReasonerFactory()实例化的是Hermit推理器的工厂类。结合你提供的版本信息(Hermit 1.3.8.510、OWLAPI 5.1.14),这个ReasonerFactory对应org.semanticweb.HermiT.ReasonerFactory,因此调用createReasoner(ontology)创建的是Hermit推理器实例。
OWL API本身仅作为本体操作框架,不自带推理器,需依赖第三方推理器实现(如Hermit、Pellet、FaCT++等),你引入了Hermit依赖,因此代码会使用Hermit作为推理后端。
2. 避免物化生成冗余owl:topObjectProperty断言的方法
方法一:自定义推理公理生成器,排除topObjectProperty相关逻辑
默认的InferredOntologyGenerator包含全类型的推理生成器,其中InferredObjectPropertyAssertionGenerator会生成包括owl:topObjectProperty在内的所有可推断对象属性断言。你可以手动指定需要的生成器,跳过会生成冗余断言的部分:
public static Ontology materialization(Ontology ontology, File inferredOntologyFile) throws OWLOntologyStorageException, IOException, OWLOntologyCreationException { OntologyManager manager = OntManagers.createManager(); OutputStream outputStream = new FileOutputStream(inferredOntologyFile); OWLDataFactory data_factory = ontology.getOWLOntologyManager().getOWLDataFactory(); OWLReasonerFactory reasoner_factory = new ReasonerFactory(); OWLReasoner reasoner = reasoner_factory.createReasoner(ontology); if (!reasoner.isConsistent()) { System.out.println("INCONSISTENT ONTOLOGY!"); } // 仅保留需要的推理生成器,跳过会生成topObjectProperty断言的模块 List<InferredAxiomGenerator<? extends OWLAxiom>> generators = new ArrayList<>(); generators.add(new InferredClassAssertionGenerator()); generators.add(new InferredSubClassAxiomGenerator()); generators.add(new InferredSubObjectPropertyAxiomGenerator()); // 根据业务需求添加其他生成器,若需保留其他对象属性断言,可使用自定义过滤后的生成器 InferredOntologyGenerator inference = new InferredOntologyGenerator(reasoner, generators); inference.fillOntology(data_factory, ontology); manager.saveOntology(ontology, new NTriplesDocumentFormat(), outputStream); outputStream.close(); return ontology; }
若仍需生成其他对象属性断言、仅排除owl:topObjectProperty,可自定义InferredObjectPropertyAssertionGenerator子类重写生成逻辑:
public class FilteredObjectPropertyAssertionGenerator extends InferredObjectPropertyAssertionGenerator { @Override protected void addAxioms(OWLNamedIndividual subject, OWLReasoner reasoner, OWLDataFactory dataFactory, Set<OWLObjectPropertyAssertionAxiom> result) { super.addAxioms(subject, reasoner, dataFactory, result); // 移除所有包含topObjectProperty的断言 result.removeIf(axiom -> axiom.getProperty().isTopEntity()); } }
之后在生成器列表中用该自定义类替代默认的InferredObjectPropertyAssertionGenerator即可。
方法二:物化后直接过滤冗余断言
在保存本体前,遍历本体公理并移除所有包含owl:topObjectProperty的对象属性断言:
// 在inference.fillOntology之后、manager.saveOntology之前添加以下代码 OWLObjectProperty topObjectProperty = data_factory.getOWLTopObjectProperty(); Set<OWLObjectPropertyAssertionAxiom> topAssertions = ontology.getObjectPropertyAssertionAxioms(topObjectProperty); manager.removeAxioms(ontology, topAssertions);
执行该逻辑后再保存本体,即可剔除所有冗余的owl:topObjectProperty(a,b)断言。
内容的提问来源于stack exchange,提问作者Eleni T

