使用内置函数的Jena自定义规则

时间:2013-05-24 14:32:26

标签: jena jena-rules

我目前正在捣乱Jena试图创建规则以添加到我的通用推理器中。我创建了以下简单规则:

[rule1: (?x ?rdf:type ?y),(?y rdfs:subClassOf ?z)-> (?x rdfs:type ?z)]

这样可以正常工作,并且正常发射,给我一切我期望的东西。在我这样做之后,我想为?x分配一个时间戳,以便我知道结论何时到来,我想使用Now内置如下。

[rule1: (?x ?rdf:type ?y),(?y rdfs:subClassOf ?z),now(?x)-> (?x rdfs:type ?z)]

遗憾的是,它不起作用,它也没有抛出错误,它似乎似乎没有将任何时间值绑定到?x,并且它似乎也阻止规则被正确触发,如第一种情况。我正在使用的本体论如下。有什么想法吗?

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
         xmlns:owl="http://www.w3.org/2002/07/owl#">
  <owl:Class rdf:about="livingthing"></owl:Class>
  <owl:Class rdf:about="Human">
    <rdfs:subClassOf rdf:resource="livingthing"/>
  </owl:Class>
  <rdf:Description rdf:about="john">
    <rdf:type rdf:resource="Human"/>
  </rdf:Description>
</rdf:RDF>

1 个答案:

答案 0 :(得分:1)

根据javadocNow将“将第一个arg绑定到当前区域设置和时区的当前日期时间。”我没有尝试使用Now,但我'期望“当前语言环境和时区中的当前日期时间”是某种RDF文字(可能是日期或日期时间)?文字不能成为RDF中三元组的主题。对于规则

[rule1: (?x ?rdf:type ?y),(?y rdfs:subClassOf ?z),now(?x) -> (?x rdfs:type ?z)]

要在图表中匹配,变量?x将绑定到日期文字,例如"2013-05-24"(但正如我所提到的,我不确切知道Now将会是什么生成)但(?x rdf:type ?y)不能有任何匹配,因为它们的格式为"2013-05-24" rdf:type ?y,并且不会出现这种格式的三元组。这意味着该规则无法触发。

如果您想为某些内容添加时间戳,您可能需要n-ary relation,这样您实际上代表(或代表?x rdf:type ?z)关系 inferredSubclassRule( ?super,?sub,?time),可以用以下空白节点在RDF中表示:

[] a :inferredSubclassRule ;
   :hasSuperClass ?super ;
   :hasSubClass ?sub ;
   :hasTimestamp ?time .