2014-09-29 83 views
0

我正在使用Drools开始一个项目。我的项目的DRL文件如下所示:如果其中一条规则未通过,Drools会忽略其余规则

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?

+0

我无法理解您的最后一段。什么是“全规则案例”,而您的过滤器示例还不清楚。 – laune 2014-09-29 14:38:27

+0

所有规则的情况下Drools运行时将触发5条规则,如果项目匹配条件。当我使用AgendaFilter仅允许“规则1”“规则2”“规则3”时,Drools将仅检查项目只有[“规则1”,“规则2”,“规则3”] – qmn1711 2014-09-30 02:47:01

+0

正如你所说:你称之为“所有规则的情况“,并使用一个AgendaFilter阻止这些规则中的一个或多个*不相同*。再一次,允许触发(通过过滤器)的规则将尽可能多地触发**,除非您添加约束条件,例如,如我的答案中所述。 – laune 2014-09-30 10:47:07

回答

1

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

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

class Marker { 
    Set<Integer> rules; 
    TheClassOfYourItem item; 
    //... 
} 

并将其与项目一起插入。然后,每个规则在发射时将其数字添加到该组。

规则 “第1条” 时 $项目:TheClassOfYourItem(...) $ M:标记(项目== $项目) 然后 $ m.add(1); 结束

然后,一个低显着性规则可以检查该集合是否具有所有/某些/没有元素。

编辑由于一些评论:如果除非所有规则都可以触发,否则不应触发规则:只需将所有条件放入单个规则并合并所有后果即可。

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 
+0

谢谢,但我不关心规则的顺序。有效的项目必须通过5条规则。如果一件物品没有通过5条规则中的任何一条,我想Drools不会解雇其余4条规则。 – qmn1711 2014-09-30 02:40:04

+1

如果你不想触发任何规则,除非你可以触发所有规则,否则你必须编写一条规则,当其中一条规则不会触发并试图在原规则之前触发这些规则时触发。或者你可以写*一个*规则结合所有五个规则的条件,并使用这个单一的规则。 – laune 2014-09-30 04:54:25