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