drools-規則引擎語法
轉 https://www.jianshu.com/p/6ca9dd36f7aa
Drools語法-Language
關鍵詞
Pakage
-
package
package
表示一個名稱空間.package是必須定義的,必須放在規則檔案第一行. -
import
import
語句的工作方式類似於Java中的import語句。您需要為要在規則中使用的任何物件指定完全限定路徑和型別名稱。 -
global
global
用於定義全域性變數。Rules:
global java.util.List myGlobalList; rule "Using a global" when eval( true ) then myGlobalList.add( "Hello World" ); end
Set the global value:
List list = new ArrayList(); KieSession kieSession = kiebase.newKieSession(); kieSession.setGlobal( "myGlobalList", list );
Function
-
function
function
是一種將語義程式碼放置在規則原始檔中的方法,而不是普通的Java類function String hello(String name) { return "Hello "+name+"!"; } import function my.package.Foo.hello rule "using a static function" when eval( true ) then System.out.println( hello( "Bob" ) ); end
Query
-
query
query
是一種搜尋工作記憶體中與指定條件匹配的事實的簡單方法.對所有30歲以上的人的簡單查詢 query "people over the age of 30" person : Person( age > 30 ) end 查詢超過x歲的人,以及居住在y的人 query "people over the age of x" (int x, String y) person : Person( age > x, location == y ) end QueryResults results = ksession.getQueryResults( "people over the age of 30" ); System.out.println( "we have " + results.size() + " people over the age of 30" ); System.out.println( "These people are are over 30:" ); for ( QueryResultsRow row : results ) { Person person = ( Person ) row.get( "person" ); System.out.println( person.getName() + "\n" ); }
Rule
rule
定義規則。rule "ruleName"
。
一個規則可以包含三個部分:屬性部分,條件部分:即LHS
,結果部分:即RHS
.
image
屬性部分-Attributes
定義當前規則執行的一些屬性等,比如是否可被重複執行、過期時間、生效時間等。activation-group
agenda-group
auto-focus
date-effective
date-expires
dialect
duration
duration-value
enabled
lock-on-active
no-loop
ruleflow-group
salience
[圖片上傳失敗...(image-26f804-1526628115111)]
-
no-loop
預設值:false
型別:Boolean
在一個規則當中如果條件滿足就對
Working Memory
當中的某個Fact物件進行了修改,比如使用update 將其更新到當前的Working Memory
當中,這時引擎會再次檢查所有的規則是否滿足條件,如果滿足會再次執行. -
ruleflow-group
預設值:N/A
型別:String
Ruleflow
是一個Drools功能,可讓您控制規則的觸發。由相同的規則流組標識彙編的規則僅在其組處於活動狀態時觸發。將規則劃分為一個個的組,然後在規則流當中通過使用ruleflow-group
屬性的值,從而使用對應的規則。 -
lock-on-active
預設值:false
型別:Boolean
當在規則上使用
ruleflow-group
屬性或agenda-group
屬性的時候,將lock-on-action
屬性的值設定為true,可能避免因某些Fact 物件被修改而使已經執行過的規則再次被啟用執行。可以看出該屬性與no-loop
屬性有相似之處,no-loop
屬性是為了避免Fact 修改或呼叫了insert
、retract
、update
之類而導致規則再次啟用執行,這裡的lock-on-action
屬性也是起這個作用,lock-on-active
是no-loop
的增強版屬性,它主要作用在使用ruleflow-group
屬性或agenda-group
屬性的時候 -
salience
預設值:0
型別:integer
設定規則執行的優先順序,
salience
屬性的值是一個數字,數字越大執行優先順序越高,同時它的值可以是一個負數.
規則的salience
預設值為0,所以如果我們不手動設定規則的salience
屬性,那麼它的執行順序是隨機的. -
agenda-group
預設值:MAIN
型別:String
規則的呼叫與執行是通過
StatelessSession
或StatefulSession
來實現的,一般的順序是建立一個StatelessSession
或StatefulSession
,將各種經過編譯的規則的package 新增到session當中,接下來將規則當中可能用到的Global物件和Fact物件插入到Session 當中,最後呼叫fireAllRules 方法來觸發、執行規則。在沒有呼叫最後一步fireAllRules
方法之前,所有的規則及插入的Fact
物件都存放在一個名叫Agenda
表的物件當中,這個Agenda
表中每一個規則及與其匹配相關業務資料叫做Activation
,在呼叫fireAllRules
方法後,這些Activation 會依次執行,這些位於Agenda 表中的Activation 的執行順序在沒有設定相關用來控制順序的屬性時(比如salience 屬性),它的執行順序是隨機的,不確定的。Agenda Group
是用來在Agenda 的基礎之上,對現在的規則進行再次分組,具體的分組方法可以採用為規則新增agenda-group
屬性來實現。agenda-group
屬性的值也是一個字串,通過這個字串,可以將規則分為若干個Agenda Group
,預設情況下,引擎在呼叫這些設定了agenda-group
屬性的規則的時候需要顯示的指定某個Agenda Group
得到Focus
(焦點),這樣位於該Agenda Group
當中的規則才會觸發執行,否則將不執行。 -
auto-focus
預設值:false
型別:Boolean
用來在已設定了
agenda-group
的規則上設定該規則是否可以自動獨取Focus
,如果該屬性設定為true,那麼在引擎執行時,就不需要顯示的為某個Agenda Group
設定Focus
,否則需要。對於規則的執行的控制,還可以使用Agenda Filter
來實現。在Drools 當中,提供了一個名為org.drools.runtime.rule.AgendaFilter 的Agenda Filter
介面,使用者可以實現該介面,通過規則當中的某些屬性來控制規則要不要執行。org.drools.runtime.rule.AgendaFilter
介面只有一個方法需要實現,方法體如下:public boolean accept(Activation activation);
在該方法當中提供了一個Activation
引數,通過該引數我們可以得到當前正在執行的規則物件或其它一些屬性,該方法要返回一個布林值,該布林值就決定了要不要執行當前這個規則,返回true 就執行規則,否則就不執行。 -
activation-group
預設值:N/A
型別:String
該屬性的作用是將若干個規則劃分成一個組,用一個字串來給這個組命名,這樣在執行的時候,具有相同
activation-group
屬性的規則中只要有一個會被執行,其它的規則都將不再執行。也就是說,在一組具有相同activation-group
屬性的規則當中,只有一個規則會被執行,其它規則都將不會被執行。當然對於具有相同activation-group
屬性的規則當中究竟哪一個會先執行,則可以用類似salience
之類屬性來實現。 -
dialect
預設值: 根據package指定
型別:String,"java" or "mvel"
dialect
種類是用於LHS或RHS程式碼塊中的任何程式碼表達式的語言。目前有兩種dialect
,Java
和MVEL
。雖然dialect
可以在包級別指定,但此屬性允許為規則覆蓋包定義。 -
date-effective
預設值:N/A
型別:字串,包含日期和時間定義。格式:
dd-MMM-yyyy
(25-Sep-2009).僅噹噹前日期和時間在日期有效屬性後面時,才能啟用規則。
-
date-expires
預設值:N/A
型別:字串,包含日期和時間定義。格式:
dd-MMM-yyyy
(25-Sep-2009).如果當前日期和時間在
date-expires
屬性之後,則無法啟用規則. -
enabled
預設值:false
型別:String
表示規則是可用的,如果手工為一個規則新增一個
enabled
屬性,並且設定其enabled
屬性值為false,那麼引擎就不會執行該規則. -
duration
預設值:無
型別:long
持續時間指示規則將在指定的持續時間之後觸發,如果它仍然是true.
條件部分-LHS
定義當前規則的條件,如when Message()
; 判斷當前workingMemory中是否存在Message物件。
Left Hand Side
(LHS
)是規則的條件部分的公共名稱。它由零個或多個條件元素組成。
如果LHS為空,它將被認為是一個條件元素,它總是為真,並且當建立一個新的WorkingMemory會話時,它將被啟用一次。
Conditions / LHS —匹配模式(Patterns)
沒有欄位約束的Pattern
Person()
有文字欄位約束的Pattern
Person( name == “bob” )
欄位繫結的Pattern
Person( $name : name == “bob” )
變數名稱可以是任何合法的java變數,$是可選的,可由於區分欄位和變數
Fact繫結的Pattern
$bob : Person( name == “bob” )欄位繫結的Pattern
變數約束的Pattern
Person( name == $name )
Drools提供了十二種型別比較操作符:>
>=
<
<=
==
!=
contains
not contains
memberOf
not memberOf
matches
not matches
-
contains
運算子
contains
用於檢查作為Collection或elements的欄位是否包含指定的值.Cheese( name contains "tilto" ) Person( fullName contains "Jr" ) String( this contains "foo" )
-
not contains
和
contains
相反 -
memberOf
運算子
memberOf
用於檢查欄位是否是集合的成員或元素;該集合必須是一個變數。CheeseCounter( cheese memberOf $matureCheeses )
-
not memberOf
和
memberOf
相反 -
matches
正則表示式匹配,與java不同的是,不用考慮'/'的轉義問題
Cheese( type matches "(Buffalo)?\\S*Mozarella" )
-
not matches
和
matches
相反
其他條件元素:
-
exists
存在。檢查Working Memory是否存在某物。使用模式
exists
,則規則將只啟用最多一次,而不管在工作儲存器中存在與存在模式中的條件匹配的資料量 -
not
不存在,檢查工作儲存器中是否存在某物。認為“
not
”意味著“there must be none of...
”。
結果部分-RHS
這裡可以寫普通java程式碼,即當前規則條件滿足後執行的操作,可以直接呼叫Fact物件的方法來操作應用。
Right Hand Side
(RHS
)是規則的結果或動作部分的通用名稱;此部分應包含要執行的操作的列表。在規則的RHS中使用命令式或條件式程式碼是不好的做法;作為一個規則應該是原子
的性質 - “when this, then do this
”,而不是“when this, maybe do this
”。規則的RHS部分也應該保持較小,從而保持宣告性和可讀性。如果你發現你需要在RHS中的命令式和/或條件程式碼,那麼也許你應該把這個規則分成多個規則。 RHS
的主要目的是插入,刪除或修改工作儲存器資料。為了協助,有一些方便的方法可以用來修改工作記憶;而不必首先引用工作記憶體例項。
-
update
更新,告訴引擎物件已經改變(已經繫結到LHS上的某個東西),並且規則可能需要重新考慮。
-
insert(new Something())
插入,往當前
workingMemory
中插入一個新的Fact物件,會觸發規則的再次執行,除非使用no-loop
限定; -
insertLogical(new Something())
類似於
insert
,但是當沒有更多的facts支援當前觸發規則的真實性時,物件將被自動刪除。 -
modify
修改,與
update
語法不同,結果都是更新操作。該語言擴充套件提供了一種結構化的方法來更新事實。它將更新操作與一些setter呼叫相結合來更改物件的欄位。 -
retract
刪除
一些內建的method。
-
drools.halt()
呼叫
drools.halt()
立即終止規則執行。這是需要將控制權返回到當前會話使用fireUntilHalt()
的點。 -
drools.getWorkingMemory()
返回WorkingMemory物件.
-
drools.setFocus( String s)
將焦點設定為指定的
agenda group
. -
drools.getRule().getName()
從規則的RHS呼叫,返回規則的名稱。
-
drools.getTuple()
返回與當前執行的規則匹配的
Tuple
,而drools.getActivation()傳遞相應的啟用。
作者:狗杞
連結:https://www.jianshu.com/p/6ca9dd36f7aa
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。