drools规则引擎
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Drools引擎
一、drools是什么
Drools是为Java量身定制的基于RETE算法的规则引擎的实现。
具有了OO(面向对象)接口的RETE,使得商业规则有了更自然的表达。
Rule是什么呢?
一条规则是对商业知识的编码。
一条规则有 attributes ,一个 Left Hand Side ( LHS )和一个 Right Hand Side ( RHS )。
Drools 允许下列几种:attributes:salience,agenda-group,no-loop,auto-focus,duration,activation-group。
1.salience
功能:设置规制执行的优先级
值:数字(数字越大执行优先级越高)
示例:
rule "rule1"
salience 1
when
eval(true)
then
System.out.println("rule1");
end
2.no-loop
功能:控制已经执行的规则条件再次满足是否再次执行
值:true/false
示例:
rule "rule1"
no-loop true
when
$customer:Customer(name=="张三")
then
update($customer);
System.out.println("customer name:"+$customer.getName());
End
3.activation-group
功能:若干个规则划分成一个组
值:分组名称
示例:
rule "rule2"
activation-group "test"
salience 10
when
eval(true)
then
System.out.println("rule2 execute");
end
rule "rule1"
activation-group "test"
salience 9
when
eval(true)
then
System.out.println("rule1 execute");
end
note:
如果同一组规则,谁的salience高就执行谁,没有则按顺序执行最后同组最后那个规则
4.date-expires
功能:当系统时间<=date-expires后才会触发
值:日期默认格式为dd-MMM-yyyy
可以设置其它时间格式如yyyy-MM-dd,需在代码设置系统时间格式
System.setProperty("drools.dateformat", "yyyy-MM-dd");
示例:
rule "rule1"
date-expires "2009-09-27"
when
eval(true);
then
System.out.println("rule1 is execution!");
end
5、duration:
规则定时,duration 3000 3秒后执行规则
6、agenda-group:
规则的调用与执行是通过Stateless KieSession或KieSession来实现的,一般的顺序是创建一个Stateless KieSession或KieSession,将各种经过编译的规则添加到session当中,然后将规则当中可能用到的Global对象和Fact对象插入到Session当中,最后调用fireAll Rules 方法来触发、执行规则。
在没有调用fireAllRules方法之前,所有的规则及插入的Fact对象都存放在一个Agen da表的对象当中,这个Agenda表中每一个规则及与其匹配相关业务数据叫做Activation,在调用fireAllRules方法后,这些Activation会依次执行,执行顺序在没有设置相关控制顺序属性时(比如salience属性),它的执行顺序是随机的。
Agenda Group是用来在Agenda基础上对规则进行再次分组,可通过为规则添加age nda-group属性来实现。
agenda-group属性的值是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group。
引擎在调用设置了agenda-group属性的规则时需要显示的指定某个Agenda Group得到Focus(焦点),否则将不执行该Agenda Group当中的规则。
规则的 LHS 由一个或多个条件( Conditions )组成。
当所有的条件( Conditions )都满足并为真时, RHS 将被执行。
RHS 被称为结果( Consequence )。
LHS 和 RHS 类似于if(<LHS>){
<RHS>
}
下面介绍几个术语:
对新的数据和被修改的数据进行规则的匹配称为模式匹配( Pattern Matching )。
进行匹配的引擎称为推理机( Inference Engine )。
被访问的规则称为 Production Memory ,被推理机进行匹配的数据称为 Working Memory 。
Agenda 管理被匹配规则的执行。
推理机所采用的模式匹配算法有下列几种:Linear , RETE , Treat , Leaps。
这里注意加红的地方,对数据的修改也会触发重新匹配,即对Working Memory中的数据进行了修改。
然后规则引擎大概是这个样子的:
这个图也很好理解,就是推理机拿到数据和规则后,进行匹配,然后把匹配的规则和数据传递给Agenda。
规则引擎实现了数据同逻辑的完全解耦。
规则并不能被直接调用,因为它们不是方法或函数,规则的激发是对 Working Memory 中数据变化的响应。
结果( Consequence ,即 R HS )作为 LHS events 完全匹配的 Listener 。
数据被 assert 进 Working Memory 后,和 Rule Base 中的 rule 进行匹配(确切的说应该是 rule 的 LHS ),如果匹配成功这条 rule 连同和它匹配的数据(此时就叫做 Activation )一起被放入 Agenda ,等待 Agenda 来负责安排激发 Activation (其实就是执行 rule 的 RH S ),下图中的菱形部分就是在 Agenda 中来执行的, Agenda 就会根据冲突解决策略来安排 Activation 的执行顺序。
下面附上drools规则引擎的执行过程
RETE算法
一、RETE概述
Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关。
Rete算法通过形成一个rete网络进行模式匹配。
利用基于规则的系统的两个特征:时间冗余性(Te mporal redundancy)和结构相似性(structural similarity)提高系统模式匹配效率。
二、相关概念
2.1、事实(fact)
事实:对象之间及对象属性之间的多元关系。
(Identifier(标识符) ^ attribute(属性) ^ value(值))
2.2、规则(rule)
由条件和结论构成的推理语句。
当存在事实满足条件时,相应的行为被激活。
(attribute(属性) ^ left hand side(LHS)(条件) ^ right hand side(RHS)(行为)) 2.3、模式(patten)
规则的IF部分,已知事实的泛化形式,未实例化得多元关系。
(可理解为条件)三、模式匹配的一般算法
规则主要由两部分组成:条件和结论,条件部分也称为左端(记为LHS, lef t-hand side),结论部分也称为右端(记为RHS, right-hand side)。
为分析方便,假设系统中有N条规则,每个规则的条件部分平均有P个模式,工作内存中有M个事实,事实可以理解为需要处理的数据对象。
规则匹配,就是对每一个规则r, 判断当前的事实o是否使LHS(r)=True,如果是,就把规则r的实例r(o)加到冲突集当中。
所谓规则r的实例就是用数据对象o的值代替规则r的相应参数,即绑定了数据对象o的规则r。
(注:上述的匹配规则中,如果当前的事实o满足两条或者多条规则,即:使得LHS(r1)和LHS(r2)同时成立怎么办?)
规则匹配的一般算法:
1) 从N条规则中取出一条r;
2) 从M个事实中取出P个事实的一个组合c;
3) 用c测试LHS(r),如果LHS(r(c))=True,将RHS(r(c))加入冲突集中;
4) 取出下一个组合c,goto 3;
5) 取出下一条规则r,goto 2;
注:由步骤3可以推测,对某个规则r来说,步骤2中选取P个事实,应该是不放回的选取。
四、RETE算法
Rete 在拉丁语中译为”net”,即网络。
Rete 匹配算法是一种进行大量模式集合和大量对象集合间比较的高效方法,通过网络筛选的方法找出所有匹配各个模式的对象和规则。
其核心思想是将分离的匹配项根据内容动态构造匹配树,以达到显著降低计算量的效果。
Rete 算法可以被分为两个部分:规则编译和规则执行。
当Rete 算法进行事实的断言时,包含三个阶段:匹配、选择和执行,称做match-select -act cycle。
规则编译是指根据规则集生成推理网络的过程;
规则执行是指将数据送入推理网络进行筛选的过程。
Rete算法的编译结果是规则集对应的Rete网络,如下图。
Rete网络是一个事实可以在其中流动的图。
Rete网络的节点可以分为四类:根节点(root)、类型节点(typenode)、alpha节点、beta节点。
其中:
根结点是一个虚拟节点,是构建rete网络的入口;
类型节点中存储事实的各种类型,各个事实从对应的类型节点进入rete网络,保证所传入的对象只会进入自己类型所在的网络,提高了工作效率。
Alpha 节点是规则的条件部分的一个模式,一个对象只有和本节点匹配成功后,才能继续向下传播;
Beta节点用于比较两个对象和它们的字段。
两个对象可能是相同或不同的类型。
我们将这两个输入称为左和右。
BetaNode 的左输入通常是一组对象的数组。
BetaNode 具有记忆功能。
左边的输入被称为Beta Memory,会记住所有到达过的语义。
右边的输入成为Alpha Memory,会记住所有到达过的对象。
Join节点:用作连接(jion)操作的节点,相当于and,相当于数据库的表连接操作,属于BetaNode 类型的节点。
Not节点:根据右边输入对左边输入的对象数组进行过滤,两个NotNode 可以完成‘ exists ’检查。
4.1 建立rete网络
Rete网络的编译算法如下
1) 创建根;
2) 加入规则1(Alpha节点从1开始,Beta节点从2开始);
a. 取出模式1,检查模式中的参数类型,如果是新类型,则加入一个类型节点;
b. 检查模式1对应的Alpha节点是否已存在,如果存在则记录下节点位置,如果没有则将模式1作为一个Alpha节点加入到网络中,同时根据Alpha节点的模式建立Alpha内存表;
c. 重复b直到所有的模式处理完毕;
d. 组合Beta节点,按照如下方式:
Beta(2)左输入节点为Alpha(1),右输入节点为Alpha(2)
Beta(i)左输入节点为Beta(i-1),右输入节点为Alpha(i) i>2
并将两个父节点的内存表内联成为自己的内存表;
(注:内连接也称为自然连接,是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
)
e. 重复d直到所有的Beta节点处理完毕;
f. 将动作(Then部分)封装成叶节点(Action节点)作为Beta(n)的输出节点;
3) 重复2)直到所有规则处理完毕;
可以把rete算法类比到关系型数据库操作:
把事实集合看作一个关系,每条规则看作一个查询,将每个事实绑定到每个模式上的操作看作一个Select操作,记一条规则为P,规则中的模式为c1,c2,…, ci, Select操作的结果记为r(ci),则规则P的匹配即为r(c1)◇r(c2)◇…◇r(ci)。
其中◇表示关系的连接(Join)(内连接(自然连接))操作。
上图(a 图和 b 图),他们的左边的部分都是beta-network, 右边都是al pha-network, 圆圈是join-node。
右边的alpha-network 是根据事实库和规则条件构建的,其中除alpha-network 节点的节点都是根据每一条规则条件的模式,从事实库中match 过来的,即在编译构建网络的过程中静态建立的。
只要事实库是稳定的,RETE 算法的执行效率应该是非常高的,其原因就是已经通过静态的编译,构建了alpha-network。
左边的beta-network 表现出了rules 的内容,其中p1,p2,p3 共享了许多BetaMemory 和join-node, 这样能加快匹配速度。
4.2 使用rete网络进行匹配
使用一个rete的过程:
1) 对于每个事实,通过select 操作进行过滤,使事实沿着rete网达到合适的alpha节点。
2) 对于收到的每一个事实的alpha节点,用Project(投影操作)将那些适当的变量绑定分离出来。
使各个新的变量绑定集沿rete网到达适当的bete节点。
3) 对于收到新的变量绑定的beta节点,使用Project操作产生新的绑定集,使这些新的变量绑定沿rete网络至下一个beta节点以至最后的Project。
4) 对于每条规则,用project操作将结论实例化所需的绑定分离出来。
下图示显示了连接(Join)操作和投影(Project)的执行过程。
4.3 Rete算法的特点
Rete算法有两个特点使其优于传统的模式匹配算法。
1、状态保存
事实集合中的每次变化,其匹配后的状态都被保存再alpha和beta节点中。
在下一次事实集合发生变化时,绝大多数的结果都不需要变化,rete算法通过保存操作过程中的状态,避免了大量的重复计算。
Rete算法主要是为那些事实集合变化不大的系统设计的,当每次事实集合的变化非常剧烈时,rete的状态保存算法效果并不理想。
2、节点共享
另一个特点就是不同规则之间含有相同的模式,从而可以共享同一个节点。
R ete网络的各个部分包含各种不同的节点共享。