drools 相关

规则引擎:基于规则的专家系统。

一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。
接受数据输入,解释业务规则,并根据业务规则做出业务决策。

RETE算法:一种进行大量模式集合和大量对象集合间比较的高效方法,通过网络筛选的方法找出所有匹配各个模式的对象和规则。
规则编译和规则执行。进行事实的断言时,包含三个阶段:匹配、选择和执行


API: 规则编译、规则收集、规则执行。
KIE:knowledge is Everything.

KieServices 
该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;
可以获取KieRepository对象,利用KieRepository来管理KieModule等。 
KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。
KieContainer 
可以理解KieContainer就是一个KieBase的容器。
KieBase 
KieBase就是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就根据KieBase创建KieSession。
KieSession 
KieSession就是一个跟Drools引擎打交道的会话,基于KieBase创建,包含运行时数据,包含Fact,并对运行时数据事实进行规则运算。
KieRepository 
KieRepository是一个单例对象,它是一个存放KieModule的仓库,KieModule由kmodule.xml文件定义(当然不仅仅只是用它来定义)。
KieProject 
KieContainer通过KieProject来初始化、构造KieModule,并将KieModule存放到KieRepository中,然后KieContainer可以通过KieProject来查找KieModule定义的信息,并根据这些信息构造KieBase和KieSession。
ClasspathKieProject 
ClasspathKieProject实现了KieProject接口,它提供了根据类路径中的META-INF/kmodule.xml文件构造KieModule的能力,也就是我们能够基于Maven构造Drools组件的基本保障之一。

创建KieBase是一个成本非常高的事情,KieBase会建立知识(规则、流程)仓库,而创建KieSession则是一个成本非常低的事情,所以KieBase会建立缓存,而KieSession则不必。 

事实(Fact):对象之间及对象属性之间的关系
规则(rule):是由条件和结论构成的推理语句,一般表示为if…Then。一个规则的if部分称为LHS,then部分称为RHS。
模式(module):就是指IF语句的条件。这里IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。

如果规则能够被表达为模板+数据的格式,就可以使用决策表。

package 是逻辑上的包,不是物理含义的包,表示逻辑聚合。
对于同一package下的用户自定义函数、自定义的查询等,不管这些函数是否在同一个规则文件里面,在规则里面都是可以直接使用的。


KieService:定义一个接口:类实现。
在接口中定义一个静态类,在类中使用反射得到接口的实现。 KieService.Factory.newInstance(). 使用静态工厂得到实例化的实现。
为什么要这么设计。???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????



drools规则:
比较操作符:>, >=, <, <=, ==, !=, contains, not contains, memberof, not memberof, matches, not matches
在使用有状态session的情况下使用嵌套属性需要注意属性的值可能被其他地方修改。

DRL特殊操作符:
!. 提供了一个默认的空判读的操作。使用此操作符时,会先校验当前对象是否为null,如果不为null再调用其方法或获得其属性进行判断。一旦当前操作对象为null,则相当于结果为false。

规则 extends ,继承了约束条件。还可以:
添加标记,在一个约束条件判断之后,使用 do 执行给定标记操作。

在RHS中可以使用LHS部分中定义的绑定变量名,设置的全局变量,。直接编写java代码。

对于KieBase来说,query的名字是全局性的,因此不要向同一RuleBase 的不同包添加相同名称的query。

一旦调用宏函数,会与所有的规则再重新匹配一次。如果匹配,会再次执行,所以有可能导致死循环,要注意。
LHS为空时,会被执行引擎改为 eval(true). 这个只会执行一次,不会重新调用导致循环。

activation-group : 同组中的所有规则,只有一个规则会被执行,。

Drools:通过向WorkingMemory中插入Fact对象的方式来实现规则引擎与业务数据的交互。



在Drools 7当中分有状态的session和无状态的session:KieSession和StatelessKieSession。
无状态Session:隔离了每次与规则引擎的交互,不会再去维护会话的状态。同时也不再提供fireAllRules方法。
使用场景: (1)数据校验 (2)运算 (3)数据过滤 (4)消息路由 (5)任何能被描述成函数或公式的规则





产生式系统:正向推理、反向推理、双向推理。
规则引擎:处理请求报文总类繁多,业务控制复杂的场景。
根据已有的事实,从规则知识库中匹配规则,并处理存在冲突的规则,执行最后筛选通过的规则。
Drools 中规则冲突决策策略有:(1) 优先级策略 (2) 复杂度优先策略 (3) 简单性优先策略 (4) 广度策略 (5) 深度策略 (6) 装载序号策略 (7) 随机策略


RETE算法简析:
alpha网络:过滤working memory,找出符合规则中每一个模式的集合,生成alpha memory(满足该模式的集合)。
beta网络: 有两种类型的节点Beta Memory和Join Node。前者主要存储Join完成后的集合。
后者包含两个输入口,分别输入需要匹配的两个集合,由Join节点做合并工作传输给下一个节点。

匹配过程:
(1)导入需要处理的事实到facts集合中。
(2)如果facts不为空,选择一个fact进行处理。否则停止匹配过程。
(3)选择alpha网的第一个节点运行(建立网络的时候设定的),通过该节点则进入alpha网的下一个节点,直到进入alpha memory。否则跳转到下一条判断路径。
(4)将alpha memory的结果加入到beta memory中,如果不为Terminal节点,则检测另一个输入集合中是否存在满足条件的事实,
满足则执行join,进入到下一个beta memory重复执行(3)。若另一个输入集合无满足条件的事实,返回到(2)。

如果该节点为Terminal节点,执行ACT并添加到facts中。


学习了很多文章。

drools: https://blog.csdn.net/wo541075754 ; https://www.ibm.com/developerworks/cn/opensource/os-drools/ ;

rete算法:https://blog.csdn.net/lfsf802/article/details/42297469;等等,。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值