本文介紹了Drools決策表操作執行順序的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個Drools決策表(見下文),其中規則2有一個條件,該條件檢查營養分值是否在某個閾值之間,并根據該條件執行操作。有一個執行檢查并執行其操作的初始規則(規則1),它更新我希望規則2在執行其條件時使用的總分數。
我的期望/需要:
要運行的規則1,如果滿足條件,則更新$Model的總分數(通過執行其操作),然后運行規則2,并且規則2的條件使用由規則1的操作運行更新的分數值。
實際發生了什么
規則1運行其條件,規則2運行其條件,規則1的操作運行,規則2的操作運行。規則%2在運行規則%1的操作之前正在運行其條件,因此使用過時的分數。
我已經證明(我認為)通過更改優先級/顯著性值,我可以更改規則運行其條件的順序,但似乎所有規則條件都在操作之前運行。我希望規則1的操作在下一條規則之前運行。
我從根本上誤解了這個概念嗎?一個明顯的錯誤?或者,如果任何人有建議的解決辦法,那將是非常好的。
澄清一下,這是一個無狀態KI會話。
提前謝謝,這快把我逼瘋了!
推薦答案
Drools的工作方式是預先獲取所有規則并評估它們的條件是否滿足。這些規則中的每一條都稱為匹配。當您啟動規則時,Drools會收集所有匹配項,對它們進行排序(自然或按重要性排序),然后遍歷并逐個執行它們。
在執行規則時,它們可能會像您的示例一樣改變工作記憶。但是,除非您顯式地告訴Drools您正在這樣做,否則它不會重新評估匹配。執行規則時,匹配階段已完成。
可以告訴Drools您正在修改工作內存,并且需要它根據新數據重新評估其規則。為此,您需要使用內置方法之一:
方法 | 說明 |
---|---|
insert |
將新事實放入工作內存。 |
delete 或retract |
從工作內存中刪除某些信息(對象)。 |
update |
更新/替換工作內存中的事實。 |
modify |
更改工作內存中數值內的字段。 |
您選擇哪一個取決于您要嘗試做什么。請注意,調用‘UPDATE’將調用要重新評估的所有匹配…這相當于使用新數據第二次調用FIRE規則(因此,同一規則可能會多次命中,這可能是故意的,也可能不是故意的)。相比之下,insert
將僅評估后續規則,以確定它們現在是否基于新條件匹配。
因此,如果您打算通過更改工作內存中的數據來觸發或不觸發其他規則,您將需要使用這些內置方法之一來告訴Drools您正在進行更改,它應該重新評估其匹配項。
我將在this answer中更詳細地討論這個概念,特別是關于DRL。同樣的概念也適用于決策表。
這篇關于Drools決策表操作執行順序的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,