如何在GenericRuleReasoner的Datalog规则中使用空节点?

时间:2014-07-07 13:16:13

标签: jena inference jena-rules

我正在使用GenericRuleReasoner来推断我的本体中的虚拟事实。 GenericRuleReasoner将推理规则作为输入中的数据记录规则作为jena inference support中的解释。这是附加到通用推理器的DatalogRule的示例:

String rules = "[r1: (?e1 st:runningTask st:gic_eth0) -> (?e1 rdf:type st:dataFromEthernet2IP)]";
Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
reasoner.setDerivationLogging(true);
InfModel inf = ModelFactory.createInfModel(reasoner, rawData);

当我在我的数据上测试此代码时,它运行良好并且感染了2000个虚拟事实。 但是,当我更改Datalog规则以创建像这样的空白节点时

String rules = "[r1: (?e1 st:runningTask st:gic_eth0) -> (_:p rdf:type st:dataFromEthernet2IP)]";

我只得到推断的虚拟事实。

GenericRuleReasoner的数据记录规则中的空节点表示是否有问题?

1 个答案:

答案 0 :(得分:1)

  

GenericRuleReasoner的数据记录规则中的空节点表示是否有问题?

是。您不要在Jena规则中使用这样的空白节点。您链接到的文档包含grammar for rules,其中没有任何内容可以允许_:p之类的节点作为节点。 Jena规则中节点的语法是:

node      :=   uri-ref               // e.g. http://foo.com/eg
          or   prefix:localname      // e.g. rdf:type
          or   <uri-ref>             // e.g. <myscheme:myuri>
          or   ?varname              // variable
          or   'a literal'           // a plain string literal
          or   'lex'^^typeURI        // a typed literal, xsd:* type names support

如果要创建新的空白节点,请使用规则正文中的makeTemp(?x) bulitin?x绑定到新的空白节点。例如,

[r1: (?e1 st:runningTask st:gic_eth0), makeTemp(?p)
     ->
     (?p rdf:type st:dataFromEthernet2IP) ]