0

以此为例,假设有一个条件说-

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

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

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

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

4

1 回答 1

2

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

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 的规则也是如此:将创建两个动作节点。

如果您实现与 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 MANY 动作节点 AS 规则

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

希望能帮助到你,

于 2013-11-05T08:59:35.490 回答