【问题标题】:what happens in rete algorithm when there are multiple "then"当有多个“then”时,rete 算法会发生什么
【发布时间】:2013-11-04 22:41:33
【问题描述】:

以this为例,假设有一个条件是-

if the flyer's status is silver, then allow free upgrade to business class **and** give a free drink

rete网络应该如何构建?在网络的底部,会有两个节点—— 1) 免费升级 2) 免费饮料

这两个节点应该如何链接到“银”节点?

我看到的所有与 Rete 算法相关的例子都在谈论一个“然后”

【问题讨论】:

    标签: drools rule-engine business-rules rete


    【解决方案1】:

    如果2个动作在同一个规则中执行,那么在“银”阿尔法节点之后只会构造1个动作节点。即

    rule "Allow free upgrade to business class and give a free drink to Silver flyers"
    no-loop true
    when
        $a: Account (status == "SILVER")
    then
        modify($a){
            .setFreeUpgrade(true);
            .setFreeDrinks(true);
        }
    end
    

    Drools 将规则的 RHS 视为黑盒。 RHS 在 RETE 网络中总是表示为一个动作节点。即使对于具有完全相同 RHS 的规则也是如此:将创建两个 Action 节点。

    如果您将相同的业务规则实现为 2 个单独的规则,则将创建 2 个 Action 节点:

    rule "Allow free upgrade to business class to Silver flyers"
    lock-on-active true
    when
        $a: Account (status == "SILVER")
    then
        modify($a){
            .setFreeUpgrade(true);            
        }
    end
    
    rule "Give a free drink to Silver flyers"
    lock-on-active true
    when
        $a: Account (status == "SILVER")
    then
        modify($a){
            .setFreeDrinks(true);
        }
    end
    

    我们可以进一步讨论哪种方法更好,但要回答您的问题,我认为这就足够了:RETE 网络将包含您在 kbase 中拥有的尽可能多的操作节点 AS 规则

    如果您使用 Drools 的 eclipse 插件,您可以看到为单个 .DRL 文件创建的 RETE 网络。编辑 DRL 时,您会注意到编辑器底部有一个选项卡,用于检查正在生成的 RETE 网络。

    希望对你有帮助,

    【讨论】:

      猜你喜欢
      • 2012-04-24
      • 2020-06-13
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多