drools rule (三) RHS语法详解
1 用法
右手邊(RHS)是規(guī)則的后果或行動部分的通用名稱;?此部分應包含要執(zhí)行的操作列表。在規(guī)則的RHS中使用命令式或條件式代碼是不好的做法;?作為一項規(guī)則應該是原子性的 - “當這個,然后做這個”,而不是“當這個,也許這樣做”。規(guī)則的RHS部分也應保持較小,從而保持其聲明性和可讀性。如果您發(fā)現(xiàn)在RHS中需要命令式和/或條件代碼,那么您可能應該將該規(guī)則分解為多個規(guī)則。RHS的主要目的是插入,刪除或修改工作內(nèi)存數(shù)據(jù)。為了幫助您,您可以使用一些方便的方法來修改工作記憶;?無需首先引用工作內(nèi)存實例。
- update(object, handle);將告訴Drools引擎一個對象已經(jīng)改變(一個已經(jīng)綁定到LHS上的東西)并且可能需要重新考慮規(guī)則。
- update(object);也可以使用;?在這里,Knowledge Helper將通過身份檢查為您查找傳遞的對象的事實句柄。(請注意,如果監(jiān)聽了插入Drools引擎的Java bean的屬性,則應該避免在對象更改時調(diào)用update())。在事實的字段值發(fā)生更改后,您必須在更改另一個事實之前調(diào)用update,否則您將導致Drools引擎中的索引出現(xiàn)問題。modify關鍵字可以避免此問題。
- insert(newSomething());會將你創(chuàng)作的新對象放入Working Memory中。
- insertLogical(newSomething());類似于insert,但是當沒有更多事實支持當前觸發(fā)規(guī)則的true時,對象將被自動刪除。
- delete(handle);從Working Memory中移除一個對象。
這些便捷方法基本上是為你提供了可以快速使用的KnowledgeHelper實例(可以從規(guī)則文件訪問工作內(nèi)存)的宏。預定義KnowledgeHelper類型變量drools允許您調(diào)用其他幾個有用的方法。(KnowledgeHelper有關更高級的操作,請參閱界面文檔)。
-
調(diào)用drools.halt()立即終止規(guī)則執(zhí)行。當當前會話是通過fireUntilHalt()進入工作區(qū)時,必須調(diào)用drools.halt()將控制權返回。
-
方法insert(Object o),update(Object o)并且delete(Object o)也可以在drools上調(diào)用,但由于他們經(jīng)常使用,所以可以忽略對象引用直接被調(diào)用。
-
drools.getWorkingMemory()返回WorkingMemory對象。
-
drools.setFocus( String s)?將焦點設置為指定的議程組。
-
drools.getRule().getName(),從規(guī)則的RHS調(diào)用,返回規(guī)則的名稱。
-
drools.getTuple()返回與當前正在執(zhí)行的規(guī)則匹配的Tuple?,drools.getActivation()傳遞相應的激活。(這些調(diào)用對于記錄和調(diào)試很有用。)
完整的Knowledge Runtime API通過另一個預定義KieContext類型的變量kcontext公開。它的方法getKieRuntime()提供了一個KieRuntime類型的對象,這反過來又提供了對大量方法的訪問,其中許多方法對編碼RHS邏輯非常有用。
-
調(diào)用kcontext.getKieRuntime().halt()立即終止規(guī)則執(zhí)行。
-
訪問者getAgenda()返回對此會話的Agenda的引用,該會話Agenda又提供對各種規(guī)則組的訪問:?activation groups, agenda groups, and rule flow groups。一個相當普遍的范例是激活一些議程組,這可以通過冗長的call來完成:
// give focus to the agenda group CleanUp kcontext.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus();(你可以使用drools.setFocus( "CleanUp" )實現(xiàn)相同的功能)?
-
要運行查詢,請調(diào)用getQueryResults(String query),然后可以處理結果,如“?查詢”一節(jié)中所述。使用kcontext.getKieRuntime().getQueryResults()或使用drools.getKieRuntime().getQueryResults()是從規(guī)則的RHS運行查詢的正確方法,也是唯一受支持的方法。
-
處理事件管理的一組方法允許您為Working Memory和Agenda添加和刪除事件監(jiān)聽器。
-
方法getKieBase()返回KieBase對象,系統(tǒng)中所有Knowledge?的主干以及當前會話的發(fā)起方。
-
您可以用setGlobal(…?),getGlobal(…?)和getGlobals()管理全局。
-
方法getEnvironment()返回運行時Environment,它的工作方式與您所知的操作系統(tǒng)環(huán)境非常相似。
?
2 modify
此語言擴展提供了fact?更新的結構化方法。它將更新操作與許多setter調(diào)用相結合,以更改對象的字段。這是modify語句的語法架構:
modify ( <fact-expression> ) {<expression> [ , <expression> ]* }帶括號的<fact-expression>必須生成事實對象引用。塊中的表達式列表應包含給定對象的setter調(diào)用,而不需要通常的對象引用(編譯器自動添加)。該示例說明了一個簡單的事實修改。
rule "modify stilton" when$stilton : Cheese(type == "stilton") thenmodify( $stilton ){setPrice( 20 ),setAge( "overripe" )} end當與細粒度屬性改變監(jiān)聽器結合使用時,使用修改語句的優(yōu)點尤其明顯。有關詳細信息,請參閱相應部分。
?
總結
以上是生活随笔為你收集整理的drools rule (三) RHS语法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编写程序计算复利-使用Pyt
- 下一篇: cent os 7.x上安装oracle