1. 程式人生 > >drools-規則引擎語法

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 修改或呼叫了insertretractupdate 之類而導致規則再次啟用執行,這裡的lock-on-action 屬性也是起這個作用,lock-on-activeno-loop 的增強版屬性,它主要作用在使用ruleflow-group 屬性或agenda-group 屬性的時候

  • salience

    預設值:0

    型別:integer

    設定規則執行的優先順序,salience 屬性的值是一個數字,數字越大執行優先順序越高,同時它的值可以是一個負數.
    規則的salience 預設值為0,所以如果我們不手動設定規則的salience 屬性,那麼它的執行順序是隨機的.

  • agenda-group

    預設值:MAIN

    型別:String

    規則的呼叫與執行是通過StatelessSessionStatefulSession 來實現的,一般的順序是建立一個StatelessSessionStatefulSession,將各種經過編譯的規則的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程式碼塊中的任何程式碼表達式的語言。目前有兩種dialectJavaMVEL。雖然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 SideLHS)是規則的條件部分的公共名稱。它由零個或多個條件元素組成。
如果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 SideRHS)是規則的結果或動作部分的通用名稱;此部分應包含要執行的操作的列表。在規則的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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。