java - 如何将 Jena 规则添加到 OntModel

标签 java rdf jena semantic-web jena-rules

我正在尝试将以字符串形式提交的 Jena 规则添加到以下方法。然而,该规则并未被添加,因为我可以验证写入 E://1_1_1 的本体没有新的更改 有人可以帮助我如何做到这一点。 关于 SO 的其他可能相关的问题是 26292160 , 349652 ;两者都与我的情况相似。

public String ValidateAndConfigureRule(String string) {     

    try{
        GenericRuleReasoner reasoner = new GenericRuleReasoner(Rule.parseRules(string));
        Model oModel = m.getOntology();

        reasoner.setDerivationLogging(true);            
        reasoner.setOWLTranslation(true);
        reasoner.setTraceOn(true);
        reasoner.setTransitiveClosureCaching(true);

        InfModel inf = ModelFactory.createInfModel(reasoner, oModel);

        inf.write(new FileWriter("E://1_1_1"));

        Model baseModel = ModelFactory.createDefaultModel();            
        baseModel.add(inf);

        final OntModel model  = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, baseModel);          

        ValidityReport validity = model.validate();
    }
}

规则本身的格式 [ r1: (?x :objProp1 :ind_x) -> (?x :objProp2 :ind_y) ] 其中 objProp 是对象属性,ind_xind_y是个体以及规则字符串中必要的“:”前缀。

最佳答案

Andy's answer这里捕获了最重要的部分:当您定义基于规则的推理模型时,模型的内容是断言的和推断的三元组;规则没有写入模型中。规则是推理器的一部分,而不是数据

这实际上与 SWRL 规则形成对比,后者定义了序列化格式,以便 SWRL 规则可以与 OWL 数据一起编写。您可以考虑使用 SWRL 规则和支持它们的推理器(例如 Pellet、HermiT)而不是 Jena 规则,因为规则可以与数据一起编写。

作为解决方法,您还可以将 Jena 规则的文本存储为 OWL 本体上注释属性的值,并在加载本体时再次读取它们。也就是说,您最终可能会得到类似的结果:

@prefix : <http://example.org/my-ontology/>

<http://example.org/my-ontology>
        a                owl:Ontology ;
        rdfs:comment     "My ontology with some Jena rules"@en ;
        :hasJenaRules    "...rule content here..." .

然后,当你加载本体时,你可以检查是否存在具有属性 :hasJenaRules 的三元组,如果有,你可以获取它们的对象,将它们解析为 Jena 规则,并使用规则创建一个推理器。我认为这将是使用 Jena 将规则与数据一起存储的最简单方法。

关于java - 如何将 Jena 规则添加到 OntModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27741590/

相关文章:

java - 读取目录中的所有RDF文件

Jena Fuseki VS Virtuoso

sparql - 如何将 4 列 N-Quad 四元组导入和查询到 Blazegraph?

windows - Cygwin 上的 tdbloader : java. lang.NoClassDefFoundError

sparql - 在sparql更新中使用LIMIT?

java - 如何验证字符串路径在java类中是否有效

java - 使用 Java 和 Selenium,如何选择下拉列表中的所有选项?

java - FirebaseJobDispatcher - 显示来自 JobService 的通知

java - 计算 String 中的字符不适用于制表符 ('\t' )。我使用错误的方法吗?

rdf - 使 OWL 数据和对象属性成为同一属性的子属性