Java 如何将规则的结果写入模型(在Jena中)?
我正在进行一个项目,需要使用Jena freamwork创建一些规则 我已经制定了规则,它们按照它们应该的方式工作。我可以在屏幕上看到输出,但我想做的是将结果存储到我拥有的本体模型中 我有以下代码:Java 如何将规则的结果写入模型(在Jena中)?,java,jena,ontology,protege,jena-rules,Java,Jena,Ontology,Protege,Jena Rules,我正在进行一个项目,需要使用Jena freamwork创建一些规则 我已经制定了规则,它们按照它们应该的方式工作。我可以在屏幕上看到输出,但我想做的是将结果存储到我拥有的本体模型中 我有以下代码: @prefix ex: <http://www.semanticweb.org/prova_rules_M#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix xsd: <
@prefix ex: <http://www.semanticweb.org/prova_rules_M#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@include <OWL>
[pippo:
(?p http://www.semanticweb.org/prova_rules_M#anni_persona ?x)
<-
(?p rdf:type ex:Persona)
(?p http://www.semanticweb.org/prova_rules_M/persona#data_nascita ?c)
myDiffDateYear(?c,"2014-06-18T00:00:00.0"^^xsd:dateTime,?x)
]
@前缀ex:。
@前缀rdf:。
@前缀xsd:。
@包括
[pippo:
(?phttp://www.semanticweb.org/prova_rules_M#anni_persona ?x)
当反向链接推理规则与模型(在本例中为infModelRULE
)关联时,其工作方式是,当有人试图读取该模型时,任何推断的三元组都可用
例如,如果您询问infModelRule.是否包含(…)
一个三元组,您知道该三元组是推断出来的,并且在输出中可以看到,那么您将得到true
。您的模型不需要单独的步骤来“写入”结果
如果将模型写入磁盘而不是仅写入标准输出(psudocode):
…然后您将看到在那里推断出的三元组。如果您以后将该文件读入模型而未附加推理器,则三元组将保留。我已按您所写的方式进行了尝试。它可以工作,但根据我的规则,它被写为“注释”,而不是“数据属性”。我希望将其作为“数据属性”来获取。您知道为什么吗?在生成的模型中是否有任何三元组描述您的
#anni_persona
属性?如果它没有显式标记为owl:ObjectProperty
或owl:DatatypeProperty
,那么像Protege这样的工具倾向于假定它是注释类型属性。如果您需要更多关于对于书面属性的解释,创建一个最小的示例(输入数据、输出数据、规则、您正在使用的任何模式等)并将其作为一个新问题发布(以便其他人也可以提供帮助)可能是有意义的。这似乎是一个与此问题不同的问题。谢谢您,Rob!没有任何三元组描述“anni#u persona”!现在它工作得很好!
String percorsoFile ="./prova_rules_M_rdf.owl";
String ruleFile= "./prova_rules_M_rdf_7_diffDate.txt";
Model rawModel = ModelFactory.createDefaultModel();
//create a resource (empty model)
Resource configuration = rawModel.createResource();
// set engine mode
configuration.addProperty(ReasonerVocabulary.PROPruleMode, "hybrid");
// set the rules file
configuration.addProperty(ReasonerVocabulary.PROPruleSet, ruleFile);
List<Rule> rules = Rule.rulesFromURL(ruleFile);
GenericRuleReasoner reasonerRULE = (GenericRuleReasoner) GenericRuleReasonerFactory.theInstance().create(configuration);
reasonerRULE.setRules(rules);
Model modelRULE= FileManager.get().loadModel(percorsoFile);
//create the inference model
InfModel infModelRULE = ModelFactory.createInfModel(reasonerRULE, modelRULE);
//force starting the rule execution
infModelRULE.prepare();
//write down the result in RDFXML form
infModelRULE.write(System.out);
try( final FileOutputStream out = new FileOutputStream(new File("blah.rdf")) ){
infModelRule.write(out);
}