0

我正在使用 GenericRuleReasoner 来推断我的本体中的虚拟事实。GenericRuleReasoner 将推理规则作为输入中的 Datalog 规则作为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 的数据记录规则中的空白节点表示是否有问题?

4

1 回答 1

1

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

是的。您不要在 Jena 规则中使用这样的空白节点。您链接到的文档包含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) ]
于 2014-07-07T15:52:53.827 回答