分享

JBoss Rules 学习(一): 什么是Rule

 raydian 2006-08-14

Rules

一条规则是对商业知识的编码。一条规则有 attributes ,一个 Left Hand Side LHS )和一个 Right Hand Side RHS )。 Drools 允许下列几种 attributes salience agenda-group no-loop auto-focus duration activation-group

rule “ < name > ”    
    
< attribute >   < value >     
    when        
        
< LHS >     
    then        
        
< RHS >
end

规则的
LHS 由一个或多个条件( Conditions )组成。当所有的条件( Conditions )都满足并为真时, RHS 将被执行。 RHS 被称为结果( Consequence )。 LHS RHS 类似于:
if  (  < LHS >  ) {
    
< RHS >
}

规则可以通过 package 关键字同一个命名空间( namespace )相关联;其他的规则引擎可能称此为规则集( Rule Set )。一个 package 声明了 imports global 变量, functions rules


package  com.sample

import  java.util.List
import  com.sample.Cheese

global List cheeses

function 
void  exampleFunction(Cheese cheese) {
    System.out.println( cheese );
}

rule “A Cheesy Rule”
    when
        cheese : Cheese( type 
==   " stilton "  )
    then
        exampleFunction( cheese );
        cheeses.add( cheese );
end

 

对新的数据和被修改的数据进行规则的匹配称为模式匹配( Pattern Matching )。进行匹配的引擎称为推理机( Inference Engine )。被访问的规则称为 ProductionMemory ,被推理机进行匹配的数据称为 WorkingMemory Agenda 管理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种: Linear RETE Treat Leaps

Drools 采用了 RETE Leaps 的实现。 Drools RETE 实现被称为 ReteOO ,表示 Drools Rete 算法进行了加强和优化的实现。



一条规则的 LHS Conditional Element 和域约束( Field Constraints )。下面的例子显示了对一个 Cheese Fact 使用了字面域约束( Literal Field Constraint

rule  " Cheddar Cheese "
    when
        Cheese( type 
==   " cheddar "  )
    then
        System.out.println( 
" cheddar "  );
end

上面的这个例子类似于:

public   void  cheddarCheese(Cheese cheese) {
    
if  ( cheese.getType().equals( " cheddar " ) {
        System.out.println( 
" cheddar "  );
    }
}
<!--[if !vml]--> <!--[endif]-->

规则引擎实现了数据同逻辑的完全解耦。规则并不能被直接调用,因为它们不是方法或函数,规则的激发是对 WorkingMemory 中数据变化的响应。结果( Consequence ,即 RHS )作为 LHS events 完全匹配的 Listener

rules 被加入 Productioin Memory 后, rules 被规则引擎用 RETE 算法分解成一个图:



Facts assert 进入 WorkingMemory 中后,规则引擎找到匹配的 ObjectTypeNode ,然后将此 Fact 传播到下一个节点。 ObjectTypeNode 拥有一块内存来保存所有匹配的 facts 。在我们的例子中,下一个节点是一个域约束( Field Constraint ), type = = “cheddar” 。如果某个 Cheese 对象的类型不是“ cheddar ”,这个 fact 将不会被传播到网络的下一个节点。如果是“ cheddar ”类型,它将被记录到 AlphaNode 的内存中,并传播到网络的下一个节点。 AlphaNode 是古典 RETE 术语,它是一个单输入 / 单输出的节点。最后通过 AlphaNode fact 被传播到 Terminal Node Terminal Node 是最终节点,到此我们说这条规则被完全匹配,并准备激发。

当一条规则被完全匹配,它并没有立刻被激发(在 RETE 中是这样,但在 Leaps 中它会立刻被激发)。这条规则和与其匹配的 facts 将激活被放入 Agenda ,由 Agenda 来负责安排激发 Activations (指的是 rule + the matched facts )。

下面的图很清楚的说明了 Drools 规则引擎的执行过程:


数据被 assert WorkingMemory 后,和 RuleBase 中的 rule 进行匹配(确切的说应该是 rule LHS ),如果匹配成功这条 rule 连同和它匹配的数据(此时就叫做 Activation )一起被放入 Agenda ,等待 Agenda 来负责安排激发 Activation (其实就是执行 rule RHS ),上图中的菱形部分就是在 Agenda 中来执行的, Agenda 就会根据冲突解决策略来安排 Activation 的执行顺序。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多