drools规则引擎分析研究

  • 1、则引擎的优点:

     1.1	使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性,降低应用程序的维护和可扩展性成本。
     1.2	分离商业决策者的商业决策逻辑和应用开发者的技术决策。
     1.3	能有效的提高实现复杂逻辑的代码的可维护性。
     1.4	在开发期间或部署后方便修复代码缺陷。
     1.5	应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内。
     1.6	符合组织对敏捷或迭代开发过程的使用。
    
  • 2、Rete算法
    Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关。Rete算法通过形成一个rete网络进行模式匹配,利用基于规则的系统的两个特征,即时间冗余性(Temporal redundancy)和结构相似性(structural similarity),提高系统模式匹配效率。

  • 2.1 网络关键字解释

     2.1.1	**alpha网络**:过滤working memory,找出符合规则中每一个模式的集合,生成alpha memory(满足该模式的集合)。有两种类型的节点,过滤type的节点和其他条件过滤的节点。
     2.1.2	**Beta网络**:有两种类型的节点Beta Memory和Join Node。前者主要存储Join完成后的集合。后者包含两个输入口,分别输入需要匹配的两个集合,由Join节点做合并工作传输给下一个节点。
     2.1.3	**Fact(事实)**:对象之间及对象属性之间的关系。
     2.1.4	**Rule(规则)**: 是由条件和结论构成的推理语句(表示:if…Then)。(LHS和RHS)
     2.1.5	**module(模式)**:是指不能继续分割的最小原子条件(组成IF语句的条件)。
     2.1.6	**root node**:所有对象进入网络的入口,在一个网络中只有一个根节点。
     2.1.7	**input node(alpha node)**:可以分为ObjectTypeNode,AlphaNode等。
     2.1.8	**object type node**:事实进入根节点进入rete网络后,会立即进入object type node节点。(该节点提供了按照对象类型过滤对象的能力)。
     2.1.9	**alpha node**:alpha节点是规则的条件部分的一个模式。(是共享的)
     2.1.10	 **beta node**:拥有两个输入的节点。用于比较两个对象。(不是共享的)
     2.1.11	 **join node** : 用作连接操作的节点,相当于数据库的表连接操作。
     2.1.12	 **NotNode**:根据右边输入对左边输入的对象数组进行过滤。
     2.1.13	 **terminal node**:到达一个终端节点,表示单条规则匹配了所有的条件,网络中有多个终端节点。当单条规则中有or时,也会产生多个终端节点。
    
  • 2.2 产生式系统的高效模式匹配算法概述:

     产生式系统主要分为,working memory(被处理的数据),用于判定的规则两个部分,其中规则又分为LHS(left-hand-side 前提)和RHS(right hand side 结论)。主要流程:
     1、	Match:找出符合LHS部分的working memory集合
     2、	confilict resolution:选出一个条件被满足的规则
     3、	act:执行RHS的内容
     4、	返回1中的数据
    
  • 2.3 Rete算法流程图
    drools规则引擎分析研究_第1张图片

  • 2.4 Rete网络创建过程解析:

     2.4.1	创建root节点(根节点),推理网络的入口。
     2.4.2	拿到规则1,从规则1中取出模式1(模式就是最小的原子条件)。
     	2.4.2.1	检查模式1中的参数类型,如果是新类型,添加一个类型节点。
     	2.4.2.2	检查模式1对应的Alpha节点是否存在,如果存在记录下节点的位置;如果没有,将模式1作为一个Alpha节点加入到网络中。同时根据Alpha节点建立Alpah内存表。
     	2.4.2.3	重复2.4.2.2,直到处理完所有模式。
     	2.4.2.4	组合Beta节点:Beta(2)左输入节点为Alpha(1),右输入节点为Alpha(2);Beta(i)左输入节点是Beta(i-1),右输入节点为Alpha(i),并将两个父节点的内存表内联成为自己的内存表。
     	2.4.2.5	重复2.4.2.4,直到所有Beta节点处理完毕。
     	2.4.2.6	将动作Then部分封装成最后节点做为Beta(n)。
     2.4.3	重复2.4.2,直到所有规则处理完毕。
    
  • 2.5 Rete网络运行过程解析:

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

  •  2.6.1	推理引擎在进行模式匹配时,先对事实进行断言,为每一个事实建立WME(Working Memory Element)。
     2.6.2	将WME从RETE鉴别网络的根结点开始匹配,因为WME传递到的结点类型不同采取的算法也不同,所以需要对alpha结点和beta结点处理WME的不同情况而分开讨论:
     	2.6.2.1	如果WME的类型和根节点的后继结点TypeNode(alpha结点的一种)所指定的类型相同,则会将该事实保存在该TypeNode结点对应的alpha存储区中,该WME被传到后继结点继续匹配,否则会放弃该WME的后续匹配;
     	2.6.2.2	如果WME被传递到alpha结点,则会检测WME是否和该结点对应的模式相匹配,若匹配,则会将该事实保存在该alpha结点对应的存储区中,该WME被传递到后继结点继续匹配,否则会放弃该WME的后续匹配:
     	2.6.2.3	如果WME被传递到beta结点的右端,则会加入到该beta结点的right存储区,并和left存储区中的Token进行匹配(匹配动作根据beta结点的类型进行,例如:join,projection,selection),匹配成功,则会将该WME加入到Token中,然后将Token传递到下一个结点,否则会放弃该WME的后续匹配:
     	2.6.2.4	如果Token被传递到beta结点的左端,则会加入到该beta结点的left存储区,并和right存储区中的WME进行匹配(匹配动作根据beta结点的类型进行,例如:join,projection,selection),匹配成功,则该Token会封装匹配到的WME形成新的Token,传递到下一个结点,否则会放弃该Token的后续匹配;
     	2.6.2.5	如果WME被传递到beta结点的左端,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照 4) 所示的方法进行匹配:
     	2.6.2.6	如果Token传递到终结点,则和该根结点对应的规则被激活,建立相应的Activation,并存储到Agenda当中,等待激发。
     	2.6.2.7	如果WME被传递到终结点,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照 1.6.2.6 所示的方法进行匹配;
    
  • 2.7 Rete算法分析:

     2.7.1	rete算法优于普通代码逻辑
     2.7.2	rete算法由于采用alphamemory和betamemory来存储事实,当事实集合变化不大时,保存的节点状态不需要太多变化。避免了大量的重复计算,提高了匹配效率。
     2.7.3	rete匹配速度和规则数目无直接关系,因为只有满足类型节点才会沿着网络传播。
     2.7.4	rete算法使用了存储区存储已经计算的中间结果,以空间换取时间,从而加快系统的速度。所以存储区会根据规则的条件和事实的数据成指数级增长,极端情况会耗尽系统资源。
    
  • 2.8 Rete详细分析可以参考:https://www.jianshu.com/p/3e9afe9e0617

你可能感兴趣的:(drools)