如何将Jena规则添加到OntModel

时间:2015-01-02 11:39:22

标签: java rdf jena semantic-web jena-rules

我正在尝试将以字符串形式提交的Jena规则添加到以下方法中。但是我没有添加规则,因为我可以验证写入E:// 1_1_1的本体没有新的变化 有人可以帮我怎么做。 关于SO的其他问题可能与26292160349652有关;两者都与我的情况相似。

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是个人以及规则字符串中“:”的必要前缀。

2 个答案:

答案 0 :(得分:1)

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

这实际上与SWRL规则形成对比,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的数据一起存储的最简单方法。

答案 1 :(得分:0)

当您编写InfModel时,它会写入基础数据 - 该数据尚未更改。规则不会写。