2017-03-29 71 views
0

我的規則使用的事實是聚合其他對象。我想解決的問題是最小和最大鏈。找出具有最高iq平均值和最低年齡的人羣(這些是事實),......以及......各種其他標準。Drools如何從大規則中獲取較小的可讀規則

看看下面的規則,如果我還有2-3個這樣的標準,LHS將變得不可讀。

我該如何做得更好?

規則 「查找泰德集團以最高的平均智商和最低的平均年齡」 當

$options: PeopleGroup(

     $averageIq : getAverageIg(this), 

     $averagAge : getAverageAge(this), 

) 

not ( PeopleGroup(getAverageIg(this) > $averageIq) 

     or PeopleGroup(getAverageIg(this) == $averageIq, getAverageAge(this) < $averagAge ) 

然後

//將PeopletGroup添加到結果

結束。

感謝

回答

0

你的問題的描述過於模糊,但我將討論幾個選項你反正。

首先,如果您正在尋找「最佳羣組」,您應該定義一個方法PeopleGroup.compareTo(PeopleGroup pg),以便PeopleGroup執行Comparable<PeopleGroup>。找到最佳組的規則應該很簡單。 (當然,您可以選擇編寫任意數量的靜態方法來比較兩個PeopleGroup對象,以獲得您可能會想到的任何排名。)無論如何,該規則將非常簡單。

rule "best group" 
when 
    $pg1: PeopleGroup() 
    not PeopleGroup(this.compareTo($pg1) > 0) 
then 
    // $pg1 is best PeopleGroup 
end 

另一種方法是通過收回不合格的事實或標記它們來過濾事實。所以,在第一遍中,你會收回沒有最大智商的任何組。接下來,您將取消沒有最低年齡的剩餘組別的資格。您需要訂購規則,使用議程組或突出顯示或額外的邏輯來控制訂單。但個別規則會很簡單。

+0

首先,感謝您的回覆!雖然我理解第二種方法,但我並沒有真正得到第一種方法。基於上面的例子,上面的規則,這個規則在第一種方法時會是怎樣的? –

+0

添加了可以使用compareTo編寫的規則。 – laune