如何将 Jena 规则添加到 OntModel
How to add Jena rule to OntModel
我正在尝试将作为字符串提交的 Jena 规则添加到以下方法。但是没有添加规则,因为我可以验证 ontology 上没有新的更改写入 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_x
、ind_y
是个体以及规则字符串中“:”的必要前缀。
当您编写 InfModel 时,它会写入基础数据 - 没有改变。规则不写。
在这里捕获了最重要的部分:当您定义基于规则的推理模型时,模型的内容是断言和推断的三元组;规则没有写入模型。规则是 reasoner 的一部分,而不是 data 的一部分。
这实际上与 SWRL 规则形成对比,后者定义了序列化格式,因此 SWRL 规则可以与 OWL 数据一起编写。您可能会考虑使用 SWRL 规则和支持它们的推理器(例如 Pellet、HermiT)而不是 Jena 规则,因为规则可以与数据一起编写。
作为解决方法,您还可以将 Jena 规则的文本存储为 OWL ontology 上注释 属性 的值,并在加载时再次读取它们ontology。也就是说,您最终可能会得到类似这样的结果:
@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..." .
然后,当你加载 ontology 时,你可以检查是否有带有 属性 :hasJenaRules 的三元组,如果有,你可以获取它们的对象,将它们解析为 Jena 规则,并使用规则创建推理器。我认为这是使用 Jena 将规则与数据一起存储的最简单方法。
我正在尝试将作为字符串提交的 Jena 规则添加到以下方法。但是没有添加规则,因为我可以验证 ontology 上没有新的更改写入 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_x
、ind_y
是个体以及规则字符串中“:”的必要前缀。
当您编写 InfModel 时,它会写入基础数据 - 没有改变。规则不写。
这实际上与 SWRL 规则形成对比,后者定义了序列化格式,因此 SWRL 规则可以与 OWL 数据一起编写。您可能会考虑使用 SWRL 规则和支持它们的推理器(例如 Pellet、HermiT)而不是 Jena 规则,因为规则可以与数据一起编写。
作为解决方法,您还可以将 Jena 规则的文本存储为 OWL ontology 上注释 属性 的值,并在加载时再次读取它们ontology。也就是说,您最终可能会得到类似这样的结果:
@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..." .
然后,当你加载 ontology 时,你可以检查是否有带有 属性 :hasJenaRules 的三元组,如果有,你可以获取它们的对象,将它们解析为 Jena 规则,并使用规则创建推理器。我认为这是使用 Jena 将规则与数据一起存储的最简单方法。