Once I've written a builtin, what do I need to do to make the reasoners aware of it?

后端 未结 1 1065
独厮守ぢ
独厮守ぢ 2020-12-07 04:12

I have written a custom builtin to use in my Project but I do not really know how I can use it. I have written two classes. In one of them there is the builtin I have made (

相关标签:
1条回答
  • 2020-12-07 05:02

    First you define a Builtin, usually by extending BaseBuiltin, and then you use BuiltinRegistry.theRegistry.register(Builtin) to make it available to Jena rule-based inference.

    Once you've done that, you need to actually use a rule that will reference your Builtin in order to trigger it.

    BuiltinRegistry.theRegistry.register( new BaseBuiltin() {
        @Override
        public String getName() {
            return "example";
        }
        @Override
        public void headAction( final Node[] args, final int length, final RuleContext context ) {
            System.out.println("Head Action: "+Arrays.toString(args));
        }
    } );
    
    final String exampleRuleString =
        "[mat1: (?s ?p ?o)\n\t-> print(?s ?p ?o),\n\t   example(?s ?p ?o)\n]"+
        "";
    System.out.println(exampleRuleString);
    
    /* I tend to use a fairly verbose syntax for parsing out my rules when I construct them
     * from a string. You can read them from whatever other sources.
     */
    final List<Rule> rules;
    try( final BufferedReader src = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(exampleRuleString.getBytes()))) ) {
        rules = Rule.parseRules(Rule.rulesParserFromReader(src));
    }
    
    /* Construct a reasoner and associate the rules with it  */
    final GenericRuleReasoner reasoner = (GenericRuleReasoner) GenericRuleReasonerFactory.theInstance().create(null);
    reasoner.setRules(rules);
    
    /* Create & Prepare the InfModel. If you don't call prepare, then
     * rule firings and inference may be deferred until you query the
     * model rather than happening at insertion. This can make you think
     * that your Builtin is not working, when it is.
     */
    final InfModel infModel = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel());
    infModel.prepare();
    
    /* Add a triple to the graph: 
    * [] rdf:type rdfs:Class
    */
    infModel.createResource(RDFS.Class);
    

    The output of this code will be:

    • The string of the forward-chaining rule
    • The result of calling the print Builtin
    • The result of calling the example Builtin

    ... which is exactly what we see:

    [mat1: (?s ?p ?o)
        -> print(?s ?p ?o),
           example(?s ?p ?o)
    ]
    -2b47400d:14593fc1564:-7fff rdf:type rdfs:Class 
    Head Action: [-2b47400d:14593fc1564:-7fff, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.w3.org/2000/01/rdf-schema#Class]
    
    0 讨论(0)
提交回复
热议问题