【问题标题】:How to use blank node in Datalog rules for GenericRuleReasoner?如何在 GenericRuleReasoner 的 Datalog 规则中使用空白节点?
【发布时间】:2014-07-07 13:16:13
【问题描述】:

我正在使用 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 的数据记录规则中的空白节点表示是否有问题?

【问题讨论】:

标签: jena inference jena-rules


【解决方案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) ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多