在外部Java项目中使用自定义内置函数

时间:2014-06-18 20:34:41

标签: java jena rule built-in

我在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”类。你能举个例子吗?我在哪里可以使用它的方法?

谢谢大家!

1 个答案:

答案 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);
    }

}