【问题标题】: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 网络。
希望对你有帮助,