我在Java程序中创建了新的自定义内置函数。它们工作正常,如果我将它们执行到一个“.txt”文件中制定规则,我会得到我期望的结果。 问题是我只能在我实现它们的地方使用这个内置函数(在同一个文件中)。
例如,我有一个名为“RulesOntology_DiffYear.java”的java类文件,其中我创建了一个名为“myDiffDate”的内置函数,它可以实现两个日期之间的差异,并返回差异的年数。 / p>
如果我尝试编写规则(使用内置的“myDiffDate”)并尝试在“RulesOntology_DiffYear.java”文件中执行它,则规则会识别新的内置并且运行它没有问题。
如果我尝试在另一个文件“.java”中编写相同的规则,我在“RulesOntology_DiffYear.java”中创建的内置文件当然无法识别。
如何在其他文件中使用我的自定义内置函数?像默认的内置插件一样?我需要创建一个库还是还有其他事情要做?
我找到了这个Create a library for new built-ins Jena,但我真的不知道它是如何工作的(即使我尝试过),我不知道这是否是我最简单的解决方案。
在我的文件“DiffDateLib.java”中,我定义了我的自定义内置“myDiffDateYear”。
我使用以下代码创建了另一个名为“MyReasonerFactory.java”的文件:
public class MyReasonerFactory implements ReasonerFactory {
/** The single global static registry */
public static BuiltinRegistry theRegistry;
private static final String RULE_LOC = "????";
static {
BuiltinRegistry.theRegistry.register(new DiffDateLib());
}
@Override
public Reasoner create(Resource r) {
final GenericRuleReasoner reasoner = new GenericRuleReasoner(this, r);
reasoner.setRules(FBRuleReasoner.loadRules(RULE_LOC));
return reasoner;
}
@Override
public Model getCapabilities() {
return GenericRuleReasonerFactory.theInstance().getCapabilities();
}
@Override
public String getURI() {
return RULE_LOC;
}
}
我可以在变量“RULE_LOC”中写什么?哪个文件路径?
我还创建了另一个名为“tryNoBuiltin.java”的类,其中包含该程序的主要内容:
public class tryNoBuiltin {
public static void main(String[] args) throws OWLOntologyStorageException,
OWLOntologyCreationException, IOException {
String percorsoFile ="./prova_rules_M_rdf.owl";
String ruleFile= "./prova_rules_M_rdf_7_diffDate.txt";
Model rawModel = ModelFactory.createDefaultModel();
MyReasonerFactory MyReas = new MyReasonerFactory();
//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);
}
}
在main中我可以看到输出,因此可以识别新的内置(我在规则文件“prova_rules_M_rdf_7_diffDate.txt”中使用过)。 但我认为我没有正确使用“MyReasonerFactory”类。你能举个例子吗?我在哪里可以使用它的方法?
谢谢大家!
答案 0 :(得分:1)
这应该对你有用。我们的想法是MyReasonerFactory
充当了为您的域检索推理器的方法。它不仅注册了内置函数,而且还获取/设置了规则。
public class MyReasonerFactory implements ReasonerFactory {
private static final String RULE_LOC = "./prova_rules_M_rdf_7_diffDate.txt";
static {
BuiltinRegistry.theRegistry.register(new DiffDateLib());
}
@Override
public Reasoner create(Resource r) {
final GenericRuleReasoner reasoner = new GenericRuleReasoner(this, r);
reasoner.setRules(Rule.rulesFromURL(RULE_LOC));
return reasoner;
}
@Override
public Model getCapabilities() {
return GenericRuleReasonerFactory.theInstance().getCapabilities();
}
@Override
public String getURI() {
// TODO NOTE this is just a suggestion
return "urn:ex:provaRuleReasoner";
}
}
加载规则时,您做了一些多余的事情。即:您在配置中设置它以及手动检索它们并解析它们。我删除了额外的东西。
public class tryNoBuiltin {
public static void main(String[] args) throws OWLOntologyStorageException,
OWLOntologyCreationException, IOException {
//Create a configuration model
Resource configuration = ModelFactory.createDefaultModel().createResource();
configuration.addProperty(ReasonerVocabulary.PROPruleMode, "hybrid");
MyReasonerFactory MyReas = new MyReasonerFactory();
GenericRuleReasoner reasonerRULE = (GenericRuleReasoner)MyReas.create(configuration);
Model modelRULE= FileManager.get().loadModel("./prova_rules_M_rdf.owl");
InfModel infModelRULE = ModelFactory.createInfModel(reasonerRULE, modelRULE);
infModelRULE.prepare();
//write down the result in RDFXML form
infModelRULE.write(System.out);
}
}