侧边栏壁纸
  • 累计撰写 2,058 篇文章
  • 累计创建 73 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

第三章 Drools自学 基础语法

大猿本猿
2021-09-07 / 486 阅读 / 0 字

规则文件构成

在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl。
drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。
—套完整的规.则文件内容构成如下:

规则体语法结构

规则体是规则文件内容中的重要组成部分,是进行业务规则判断、处理业务结果的部分。规则体语法结构如下:
rule:关键字,表示规则开始,参数为规则的唯一名称。
attributes:规则属性,是rule与when之间的参数,为可选项。when:关键字,后面跟规则的条件部分。
LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。
then:关键字,后面跟规则的结果部分。
RHS(Right Hand Side):是规则的后果或行动部分的通用名称。
end:关键字,表示一个规则结束。

注释

在drl形式的规则文件中使用注释和Java类中使用注释一致,分为单行注释和多行注释。
单行注释用"I""进行标记,多行注释以"/*"开始,以"*八""结束。如下示例:

Pattern模式匹配

前面我们已经知道了Drools中的匹配器可以将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,那么我们就需要在规则体的LHS部分定义规则并进行模式匹配。LHS部分由一个或者多个条件组成,条件又称为pattern。
pattern的语法结构为:
绑定变量名:Object(Field约束)
其中绑定变量名可以省略,通常绑定变量名的命名一般建议以$开始。如果定义了绑定变量名,就可以在规则体的RHS部分使用此绑定变量名来操作相应的Fact对象。Field约束部分是需要返回true或者false的0个或多个表达式。
通过上面的例子我们可以知道,匹配的条件为:
1、工作内存中必须存在Order这种类型的Fact对象-----类型约束
2、Fact对象的originalPrice属性值必须小于200------属性约束
3、Fact对象的originalPrice属性值必须大于等于100------属性约束以上条件必须同时满足当前规则才有可能被激活。
邦定变量既可以用在对象上,也可以用在对象的属性上。例如上面的例子可以改为:
LHS部分还可以定义多个pattern,多个pattern之间可以使用ard或者or进行连接,也可以不写,默认连接为and。

 比较操作符

  • contains | not contains语法结构
object(Field[Collection/Array] contains value)Object(Field[Collection/Array] not contains value).
  • memberof | not memberOf语法结构
object(field memberOf value[Collection/Array])Object(field not memberOf value[Collection/Array]). 
  • matches | not matches语法结构
Object(field matches "正则表达式")Object(field not matches "正则表达式")

执行指定规则

fireRules->fireRules(AgendFilter)
通过前面的案例可以看到,我们在调用规则代码时,满足条件的规则都会被执行。那么如果我们只想执行其中的某个规则如何实现呢?
Drools给我们提供的方式是通过规则过滤器来实现执行指定规则。对于规则文件不用做任何修改,只需要修改Jlava代码即可,如下:
//通过规则过滤器实现只执行指定规则
kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule_comparison_memberOf"));
传入规则名称,执行指定规则。

关键字

Drools的关键字分为:硬关键字(Hard keywords)和软关键字(Soft keywords)。
硬关键字是我们在规则文件中定义包名或者规则名时明确不能使用的,否则程序会报错。软关键字虽然可以使用,但是不建议使用。
硬关键字包括: true false null

Drools内置方法

规则文件的RHs部分的主要作用是通过插入,删除或修改工作内存中的Fact数据,来达到控制规则引擎执行的目的。
Drools提供了一些方法可以用来操作工作内存中的数据,操作完成后规则引擎会重新进行相关规则的匹配,原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。
update       update方法的作用是更新工作内存中的数据,并让相关的规则重新匹配。 (要避免死循环)
insert         insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配。
retract     retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配。