Jena 研究 之 Inference API 之 Rule语法结构

2020-03-14   113 次阅读


语法直接copy的官方教程的推理API教程
实际上这个rule的语法使用了部分sparql的语法用于查询匹配

Rule      :=   bare-rule .
          or   [ bare-rule ]
       or   [ ruleName : bare-rule ]
bare-rule :=   term, … term -> hterm, … hterm    // forward rule
or   bhterm <- term, … term    // backward rule


hterm     :=   term
or   [ bare-rule ]


term      :=   (node, node, node)           // triple pattern
or   (node, node, functor)        // extended triple pattern
or   builtin(node, … node)      // invoke procedural primitive


bhterm      :=   (node, node, node)           // triple pattern


functor   :=   functorName(node, … node)  // structured literal


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 supported
or   number                      // e.g. 42 or 25.5

我觉得单单列出这一大坨并不是很好理解
还是从例子入手

example1

[allID: (?C rdf:type owl:Restriction), (?C owl:onProperty ?P),
     (?C owl:allValuesFrom ?D)  -> (?C owl:equivalentClass all(?P, ?D)) ]
  • allID指的是你要定义这个规则的名称,可自定义
  • 注意观察中间箭头的指向,"->"或"<-",箭头尾巴的部分是多个匹配条件,可用,分隔,满足所有条件后方可触发执行箭头指向的内容
  • 解析:
    • 第一个条件:匹配的第一个对象C 类型 是owl:Restriction
    • 第二个条件:匹配的第一个对象C owl:onProperty于 第二个对象P
    • 第三个条件:匹配的第一个对象C 所有value来源于 第三个对象D
    • 满足三个条件后生成新隐含语句:?C owl:equivalentClass all(?P, ?D,也就是说 C 与 all(?P, ?D)相等

example2

[all2: (?C rdfs:subClassOf all(?P, ?D)) -> print(‘Rule for ‘, ?C)
[all1b: (?Y rdf:type ?D) <- (?X ?P ?Y), (?X rdf:type ?C) ] ]

一个规则可以触发其他新的规则
在这个例子中,一旦all2规则满足条件后一方面执行print函数,一方面激活all1b规则从而继续执行,注意all1b是一个后向(backward)规则

example3

allID: (?C rdf:type owl:Restriction), (?C owl:onProperty ?P),
     (?C owl:allValuesFrom ?D)  -> (?C owl:equivalentClass all(?P, ?D)) ]
[all2: (?C rdfs:subClassOf all(?P, ?D)) -> print(‘Rule for ‘, ?C)
[all1b: (?Y rdf:type ?D) <- (?X ?P ?Y), (?X rdf:type ?C) ] ]

规则与规则之间不需要逗号

前向链接引擎

  • 在正向模式运行时,即使将所有规则以反向"<-"形式编写,也将其视为向前
  • 不能保证匹配规则的触发顺序或者主体术语的测试顺序,但是一旦触发,其标题将从左向右执行

后向链接引擎

  • 倘若规则推理机以向后链接模式运行将使用逻辑编程LP引擎
  • 一般规则会按照从上到下,从左到右的顺序执行,并具有回溯功能

混合规则引擎

规则推理器可以同时选择使用两个单独的规则引擎
jenainffigure2.png

  • 前向引擎在推导存储中维护一组推断的语句
  • 断言新的后向规则得的任何前向规则将根据前向变量绑定实例化那些规则,并将实例化的规则传递给后向引擎
  • 通过使用后向链接LP引擎(将提供的规则与生成的规则的合并应用于原始数据与推导数据的合并)来回答查询
  • 该拆分使得规则集开发人员仅通过添加与手头数据集相关的后向规则即可获得更高的性能

Jena Rule相关参数

参数取值描述
PROPruleMode"forward", "forwardRETE", "backward", "hybrid"设置规则推理方向,前向,RETE版前向,反向与混合机制
PROPruleSetfilename-string存储规则的文件的名字
...更多相关参数请看教程...

Jena 内置原语

原语操作
isLiteral(?x) notLiteral(?x)测试所选内容是或不是一个Literal
isFunctor(?x) notFunctor(?x)测试所选内容是或不是一个functor-valued literal
isBNode(?x) notBNode(?x)测试所选内容是否是空结点(blank-node)
bound(?x...) unbound(?x..)测试括号内的所有参数是否都是“绑定变量(bound variables)”
equal(?x,?y) notEqual(?x,?y)测试x与y是否相等/不相等,注意是语义相等性,比如xsd:int 1和xsd:decimal 1是相等的
lessThan(?x, ?y), greaterThan(?x, ?y),le(?x, ?y), ge(?x, ?y)测试是否 x<y, x>y, x<=y, x>=y,当且仅当x与y都是number或者time时间(允许类型:整型,浮点型,或者XSDDate Time)
-下列7个函数都不能在反向中运行
sum(?a, ?b, ?c)将c设置为(a+b)
addOne(?a,?c)将c设为(a+1)
difference(?a, ?b, ?c)将c设置为(a-b)
min(?a, ?b, ?c)将c设置为a与b中较小的一个
max(?a, ?b, ?c)将c设置为a与b中较大的一个
product(?a, ?b, ?c)将c设置为(a*b)
quotient(?a, ?b, ?c)将c设置为(a/b)
--
strConcat(?a1, .. ?an, ?t)将除了最后一个参数之外的所有参数连接起来并将最后一个参数绑定到具有词法形式的Literal(strConcat)或者URI结点(uriConcat)
regex(?t, ?p),regex(?t, ?p, ?m1, .. ?mn)t为原字段,p为正则表达式,而后的n个参数用于接收匹配到的若干个结果
now(?x)将x绑定到value是当前的时间的 xsd:dateTime
makeTemp(?x)将x绑定到一个新的空白节点(blank node)
makeInstance(?x, ?p, ?v),makeInstance(?x, ?p, ?t, ?v)将v绑定到一个(?x,?p,*)或者(?x,?p,?v)样式的空节点(插入提供内容)
noValue(?x, ?p),noValue(?x ?p ?v)值为tur如果模型中没有括号内的元组或是已知的前向推导
print(?x, ...)打印出每个参数的表示形式
...更多相关参数请看官方文档

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议