Rules
一條規則是對商業(yè)知識的編碼。一條規則有 attributes ,一個(gè) Left Hand Side ( LHS )和一個(gè) Right Hand Side ( RHS )。 Drools 允許下列幾種 attributes : salience , agenda-group , no-loop , auto-focus , duration , activation-group 。
規則可以通過(guò) package 關(guān)鍵字同一個(gè)命名空間( namespace )相關(guān)聯(lián);其他的規則引擎可能稱(chēng)此為規則集( Rule Set )。一個(gè) package 聲明了 imports , global 變量, functions 和 rules 。
import java.util.List
import com.sample.Cheese
global List cheeses
function void exampleFunction(Cheese cheese) {
System.out.println( cheese );
}
rule “A Cheesy Rule”
when
cheese : Cheese( type == " stilton " )
then
exampleFunction( cheese );
cheeses.add( cheese );
end
對新的數據和被修改的數據進(jìn)行規則的匹配稱(chēng)為模式匹配( Pattern Matching )。進(jìn)行匹配的引擎稱(chēng)為推理機( Inference Engine )。被訪(fǎng)問(wèn)的規則稱(chēng)為 ProductionMemory ,被推理機進(jìn)行匹配的數據稱(chēng)為 WorkingMemory 。 Agenda 管理被匹配規則的執行。推理機所采用的模式匹配算法有下列幾種: Linear , RETE , Treat , Leaps 。
Drools 采用了 RETE 和 Leaps 的實(shí)現。 Drools 的 RETE 實(shí)現被稱(chēng)為 ReteOO ,表示 Drools 對 Rete 算法進(jìn)行了加強和優(yōu)化的實(shí)現。
一條規則的 LHS 由 Conditional Element 和域約束( Field Constraints )。下面的例子顯示了對一個(gè) Cheese Fact 使用了字面域約束( Literal Field Constraint )
上面的這個(gè)例子類(lèi)似于:
規則引擎實(shí)現了數據同邏輯的完全解耦。規則并不能被直接調用,因為它們不是方法或函數,規則的激發(fā)是對 WorkingMemory 中數據變化的響應。結果( Consequence ,即 RHS )作為 LHS events 完全匹配的 Listener 。
當 rules 被加入 Productioin Memory 后, rules 被規則引擎用 RETE 算法分解成一個(gè)圖:
當 Facts 被 assert 進(jìn)入 WorkingMemory 中后,規則引擎找到匹配的 ObjectTypeNode ,然后將此 Fact 傳播到下一個(gè)節點(diǎn)。 ObjectTypeNode 擁有一塊內存來(lái)保存所有匹配的 facts 。在我們的例子中,下一個(gè)節點(diǎn)是一個(gè)域約束( Field Constraint ), type = = “cheddar” 。如果某個(gè) Cheese 對象的類(lèi)型不是“ cheddar ”,這個(gè) fact 將不會(huì )被傳播到網(wǎng)絡(luò )的下一個(gè)節點(diǎn)。如果是“ cheddar ”類(lèi)型,它將被記錄到 AlphaNode 的內存中,并傳播到網(wǎng)絡(luò )的下一個(gè)節點(diǎn)。 AlphaNode 是古典 RETE 術(shù)語(yǔ),它是一個(gè)單輸入 / 單輸出的節點(diǎn)。最后通過(guò) AlphaNode 的 fact 被傳播到 Terminal Node 。 Terminal Node 是最終節點(diǎn),到此我們說(shuō)這條規則被完全匹配,并準備激發(fā)。
當一條規則被完全匹配,它并沒(méi)有立刻被激發(fā)(在 RETE 中是這樣,但在 Leaps 中它會(huì )立刻被激發(fā))。這條規則和與其匹配的 facts 將激活被放入 Agenda ,由 Agenda 來(lái)負責安排激發(fā) Activations (指的是 rule + the matched facts )。
下面的圖很清楚的說(shuō)明了 Drools 規則引擎的執行過(guò)程:
數據被 assert 進(jìn) WorkingMemory 后,和 RuleBase 中的 rule 進(jìn)行匹配(確切的說(shuō)應該是 rule 的 LHS ),如果匹配成功這條 rule 連同和它匹配的數據(此時(shí)就叫做 Activation )一起被放入 Agenda ,等待 Agenda 來(lái)負責安排激發(fā) Activation (其實(shí)就是執行 rule 的 RHS ),上圖中的菱形部分就是在 Agenda 中來(lái)執行的, Agenda 就會(huì )根據沖突解決策略來(lái)安排 Activation 的執行順序。
聯(lián)系客服