当有多个“然后”时,在rete算法中会发生什么

时间:2013-11-04 22:41:34

标签: drools rule-engine business-rules rete

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

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

如何构建网络?在网络的底部,将有两个节点 - 1)免费升级2)免费饮料

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

我见过的所有与Rete算法有关的例子都谈到了一个“然后”

1 个答案:

答案 0 :(得分:2)

如果在同一规则中执行了2个动作,那么在“silver”alpha节点之后只会构造1个Action节点。即。

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网络中的Action节点。即使对于具有完全相同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网络将包含AS MANY Action节点您在kbase中的AS规则

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

希望它有所帮助,