1,规则文件的组成
在实际应用中,主要的任务其实就是写规则文件,规则文件的后缀通常以.drl结尾(drools规则引擎除了支持.drl格式的文件外,还支持excel文件类型的,就是规则表);drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。
关键字 | 描述 |
---|---|
package | 包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用 |
import | 用于导入类或者静态方法 |
global | 全局变量 |
function | 自定义函数 |
query | 查询 |
rule end | 规则体 |
2,规则文件的基本格式组成
rule "ruleName" attributes when LHS then RHS end |
rule:关键字,表示规则开始,参数为规则的唯一名称。
attributes:规则属性,是rule与when之间的参数,为可选项。
when:关键字,后面跟规则的条件部分。
LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。
then:关键字,后面跟规则的结果部分。
RHS(Right Hand Side):是规则的后果或行动部分的通用名称。
end:关键字,表示一个规则结束。
3,注释
在drl形式的规则文件中使用注释和Java类中使用注释一致,分为单行注释和多行注释。
单行注释用"//"进行标记,多行注释以"/*"开始,以"*/"结束。如下示例:
//规则rule1的注释,这是一个单行注释 rule "rule1" when then System.out.println("rule1触发"); end /* 规则rule2的注释, 这是一个多行注释 */ rule "rule2" when then System.out.println("rule2触发"); end |
4,pattern模式匹配
前面我们已经知道了Drools中的匹配器可以将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,那么我们就需要在规则体的LHS部分定义规则并进行模式匹配。LHS部分由一个或者多个条件组成,条件又称为pattern。
pattern的语法结构为:绑定变量名:Object(Field约束)
其中绑定变量名可以省略,通常绑定变量名的命名一般建议以$开始。如果定义了绑定变量名,就可以在规则体的RHS部分使用此绑定变量名来操作相应的Fact对象。Field约束部分是需要返回true或者false的0个或多个表达式。
package rules; import com.dream21th.drools.study.demo2.Student; rule "demo2_1" //匹配年龄小于10岁 when $s:Student( age<10) then System.out.println("触发demo2_1:年龄小于"+$s.getAge()); $s.setResult("触发demo2_1:年龄小于"+$s.getAge()); end rule "demo2_2" //匹配年龄等于10岁 when $s:Student( age==10) then System.out.println("触发demo2_2:年龄等于"+$s.getAge()); $s.setResult("触发demo2_2:年龄等于"+$s.getAge()); end rule "demo2_3" //匹配年龄大于10岁 when $s:Student( age>10) then System.out.println("触发demo2_3:年龄大于"+$s.getAge()); $s.setResult("触发demo2_3:年龄大于"+$s.getAge()); end rule "demo2_4" //匹配年龄大于10岁 并且性别是“男” when $s:Student( age>10 && sex=="男") then System.out.println("触发demo2_4:年龄大于"+$s.getAge()+"且性别:"+$s.getSex()); $s.setResult("触发demo2_4:年龄大于"+$s.getAge()+"且性别:"+$s.getSex()); end rule "demo2_5" //匹配年龄大于10岁 并且性别是“女” when $s:Student( age>10 && sex=="女") then System.out.println("触发demo2_5:年龄大于"+$s.getAge()+"且性别:"+$s.getSex()); $s.setResult("触发demo2_5:年龄大于"+$s.getAge()+"且性别:"+$s.getSex()); end |
通过上面的例子我们可以知道,匹配的条件为:
1、工作内存中必须存在Order这种类型的Fact对象-----类型约束
2、Fact对象的age属性值必须满足约束条件------属性约束
3、Fact对象的sex属性值必须满足约束条件-----属性约束
以上条件必须同时满足当前规则才有可能被激活。