我有两个 int 字段的简单 JAVA bean:'a' 和 'b'。
我有两个规则:
rule "First rule"
salience 10
when
$bean : Bean ( a == 1)
then
$bean.setB(10);
end
rule "Second rule"
salience 20
when
$bean : Bean ( a == 1)
then
$bean.setB(20);
end
Run Code Online (Sandbox Code Playgroud)
实际结果:首先触发“第二条规则”(更高的显着性),第二条触发“第一条规则”。
预期结果:仅触发一条规则(具有最高显着性)。其他规则被忽略。这该怎么做?在 Drools 中可能吗?我正在使用 Drools 6.0.0 Final。
要求: 1. 我不能使用“激活组”。2. 我不想在每个 bean 上使用 'retract'。
更新
真的很感谢你的回答。
也许我应该详细描述我的问题。我有一套 1500 条规则。每条规则:
我想得到什么? 当我有冲突(输入事实与两个或更多规则匹配)时,我只想触发一个具有最高显着性的规则。应该忽略这一事实的其他匹配规则。最重要的是性能 - 这应该尽可能快地工作。
我所做的? 目前我有两种解决方案,但我不知道哪个更好,或者我应该以不同的方式解决这个问题。
解决方案 1 - 有状态会话
爪哇代码:
for (Object fact : facts) {
FactHandle fh = session.insert(fact);
session.fireAllRules(1);
session.delete(fh);
}
Run Code Online (Sandbox Code Playgroud)
解决方案 2 - 无状态会话
爪哇代码:
for (Object fact : facts) {
session.execute(fact);
}
Run Code Online (Sandbox Code Playgroud)
解决方案 2 的 DRL 文件:我向每个规则添加了相同的激活组:
rule "Rule"
activation-group "group"
salience X
when
...
then
...
Run Code Online (Sandbox Code Playgroud)
根据你的问题,我担心你可能误解了显着点。显着性是一个优先级值。Drools 使用它来确定在满足多个规则的约束的情况下首先触发哪个流口水。
[在某些情况下触发规则 P 并且在触发规则 P 时不规则 Q] 的问题是一个常见问题。您的对象模型应该设置为这是对您的概念空间进行推理的自然结果。对于您列出的文字情况,您可以尝试将新事实插入工作内存(“RuleFiredFact”,值为“2nd”,或其他)。然后,您将在第一个规则约束中检查这一事实。如果为真,则不会触发第一条规则。
更新: 明确地说,“RuleFiredFact”是事实模型中某些具体事实的抽象占位符。drools 的部分要点是不在 drools DSL 中使用抽象的东西。
更新:
有状态与无状态会话是否合适将在很大程度上取决于您的可用计算机资源、对象模型、团队,列表还在继续。如果您不知道使用哪个,您应该参考有关该主题的讨论。你可以试试这个旧的邮件列表帖子http://drools.46999.n3.nabble.com/Advice-sought-on-choosing-Stateful-or-Stateless-sessions-td57069.html
无论您选择哪种方式,我都强烈怀疑您的对象模型太浅了。创建一个包含一个事实的流口水系统是非常罕见的,然后再也不创建了。流口水的要点是对许多事实进行推理。解决这个问题的方法可能是在你的对象中移动并将其中的信息作为事实插入到流口水的工作记忆中。然后,您将编写仅在您想要的约束下触发的规则。
在我所描述的情况下,有很多方法可以确保只触发一个规则。您的规则可能都在寻找“factWasAlreadyReasonedOverFact”,并引用触发执行的事实。这是一个非常粗略的例子。希望它给你一个想法。
首先让我告诉你,你这里有一些奇怪的场景:)
这个问题有多种解决方案:
希望能帮助到你,
| 归档时间: |
|
| 查看次数: |
18647 次 |
| 最近记录: |