1.规则文件语法和支持的语言
规则文件有自己的语法用于绑定参数,条件判断跟 function ,queries等构成规则文件部分。
其它部分可以使用规则文本支持语言的脚步:目前支持:mvel和Java。默认使用java.
不管使用那种语言,要遵守那种语言的语法
示例:
package com.demo
rule "It of valid age"
when
$a : Applicant( age < 18 )
then
$a.setValid(false);
end
note:
黑体字是规则文件关键字该颜色字体是规则文件语法该颜色字体是java语法$a是规则内的变量,在规则内对该规则变量操作
2.规则文件构成
package(规则文件所在包*)
import(导入java 包)
globals
function(函数)
queries(查找)
rules(规则*)
3.规则引擎处理规则文件流程
输入参数 ---> 引擎读规则文件并绑定输入参数 ---> 处理规则满足条件则按结果部分逻辑处理
4.编写规则文件思路
import 必须的包和类,和Java静态方法,语句要以;号结束等java属性处理语句只能出现rule的结果部分,而在条件部分则只能是创建语句在条件部分要使用规则引擎的语法
5.语法介绍
- 绑定参数语法:
$[绑定变量名] : Object([field 约束])
示例:$add : Address() add 绑定外面传入的Address对象$add : new Address() add 绑定新建的Address对象$name:String(); 传入一个字符串与name绑定
- 条件判断
$绑定变量名 :绑定类型(属性1 比较符合 比较值)
note:括号内可以包含多个属性比较有 “&&”、 “||” , “,”“&&”表示and、 “||”表示or , “,”表示连接
示例:$app:Applicant(name == "依晨",age<30)#必须是满足name=依晨,age<30的Applicant
结果部分处理
1.通过insert,update和 retract对当前 Working Memory 中的 Fact 对象进行新增、删除或者是修改。
note:
一旦调用insert,update和 retract宏函数,那么 Drools会重新与所有的规则再重新匹配一次,对于没有设置 no-loop 属性为 true的规则,如果条件满足,不管其之前是否执行过都会再执行一次
- insert
作用:在Java类当中调用StatefulKnowledgeSession对象的insert方法的作用相同
语法:insert(new Object());
示例:rule "rule1"
salience 1
when
eval(true);
then
System.out.println("rule1");
Applicant app = new Applicant("kaka",24);
#insert(app);
drools.insert(app);
end
- update
作用:
update函数意义与其名称一样,用来实现对当前Working Memory当中的Fact进行更
语法:
update(new Object());
示例:
rule "rule2"salience 1#no-loop true 不会循环when$app:Applicant(name == "依晨",age<30)then#update方法2Applicant app = new Applicant("依晨",$app.getAge() + 1);update(drools.getWorkingMemory().getFactHandleByIdentity($app),app);#update方法1#$app.setAge($app.getAge() + 1);#update($app);System.out.println("------" + $app.getName()+"("+ $app.getAge() + ")");end
- retract
作用:和 StatefulSession 的 retract方法一样,宏函数 retract也是用来将 Working Memory当中某个 Fact对象从Working Memory当中删除
语法:update(new Object());
示例:rule "rule2"
salience 1
when
$app:Applicant(name == "依晨");
then
#retract($app);drools.retract($app);
end
note:
除了insert,update和 retract函数外还有drools 宏对象来处理规则.还可以通过$绑定变量名.绑定Java对象的方法$app.setAge($app.getAge() + 1);