如果其中一条规则没有通过,Drools会忽略其余的规则

时间:2014-09-29 10:12:20

标签: drools

我和Drools一起开始了一个项目。我的项目的drl文件看起来像:

rule "Rule 1"
when
    Item( id > 100)
// consequence implementation

rule "Rule 2"
when
    Item( type == "phone")
// consequence implementation

rule "Rule 3"
when
    Item( screenSize == 5)
// consequence implementation

rule "Rule 4"
when
    Item( branch == "motorola")
// consequence implementation

rule "Rule 5"
when
    Item( price > 200)
// consequence implementation

当Drools跑步时,我有5个被解雇的规则。如果一个项目没有通过5个消防规则中的一个,我希望Drools会忽略其余4个被解雇的规则。 Drools是否具有我的目的?

另一个重要的事情是我的Drools与AgendaFilter一起运行。该功能是否支持AgendaFilter?

1 个答案:

答案 0 :(得分:0)

首先,标题中的短语"其余规则"似乎表明您认为规则是按特定顺序评估的(例如,如文件中所写)。事实并非如此:没有订单。因此,如果规则#1和#2解雇(ìd > 0type == "phone")和screenSize != 5,规则#4和规则#5仍然会触发,或它们可能已经触发烧制

要发现在规则1到5中引用类的某个事实是否参与了这些规则中的全部或部分规则,您必须创建自己的逻辑。例如,使用

声明一个类型/类
class Marker { 
  Set<Integer> rules;
  TheClassOfYourItem item;
  //...
}

并将其与项目一起插入。然后,每个规则在触发时,将其编号添加到集合中。

规则&#34;规则1&#34;    什么时候        $ item:TheClassOfYourItem(...)        $ m:Marker(item == $ item)    然后        $ m.add(1);    端

然后一个低显着性的规则可以检查该集合是否具有all / some / none元素。

由于一些评论,

编辑:如果除非所有规则都可以触发,否则不会触发任何规则:只需将所有条件放入单个规则并合并所有后果。

rule "Rule 1-5"
when
    Item( id > 100, type == "phone". screenSize == 5,
          branch == "motorola", price > 200)
then
    // ... Do what needs to be done if all five conditions are true
end