2014-09-29 80 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