我正在开发一个项目,我需要使用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)
]
在这个例子中,我使用的是我之前创建的自定义内置程序。它返回两个日期之间的差异年数。由于以下代码,我可以在屏幕上看到输出:
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);
如何在模型中编写数据属性“anni_persona”的结果(而不仅仅是作为输出)?
谢谢。
答案 0 :(得分:2)
当向后链接推理规则与模型(在本例中为您的infModelRULE
)关联时,其工作方式是,当某些内容尝试读取该模型时,任何推断的三倍都可用。
例如,如果您询问infModelRule.contains(...)
您知道的三元组是否已推断并且您在输出中看到了,那么您将获得true
作为结果。您的模型不需要单独的步骤来编写&#39;结果。
如果您将模型写入磁盘而不仅仅是标准输出(psudocode):
try( final FileOutputStream out = new FileOutputStream(new File("blah.rdf")) ){
infModelRule.write(out);
}
...然后你会看到那里推断出的三元组。如果你以后在没有附加推理器的情况下将该文件读入模型,那么三元组将会保留。