Java 如何将规则的结果写入模型(在Jena中)?

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: <

我正在进行一个项目,需要使用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: <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);
}