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