<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    guangnian0412's BLOG

    Java in my life

    常用鏈接

    統計

    積分與排名

    我關注的Blog

    最新評論

    JBoss Rules 學習(七): Drools規則語言詳解(下)


    Drools規則語言詳解(下)


    5. Rule

    Figure?5.1.?rule

    Rule 結構是最重要的結構。 Rule 使用了形如“ IF something THEN action (當然,我們的關鍵字是“ when ”和“ then ”)的形式。

    一個規則在一個 package 中必須要有唯一的名字。如果一個名字中含有空格,那就需要將名字放在雙引號中(最好總是使用雙引號)。

    Attribute 是可選的(最好是每行只有一個 Attribute )。

    規則的 LHS 跟在“ when ”關鍵字的后面(最好是另起一行),同樣 RHS 要跟在“ then ”關鍵字后面(最好也另起一行)。規則以關鍵字“ end ”結束。規則不能嵌套。

    5.1 Left Hand Side

    Left Hand Side 其實就是規則的條件部分。 LHS 對應的 rail-road 圖如下,我們在后面會做進一步解釋:


    Figure?5.2.?Left Hand Side


    Figure?5.3.?pattern

    5.2 Right Hand Side

    Right Hand Side RHS )就是規則的結果( consequence )或者動作( action )部分。 RHS 的目的是 retract add facts WorkingMemory 中,還有針對你的 application 的動作。實際上, RHS 是當規則激發( fire )時執行的代碼塊。

    RHS 中,你可以使用幾個方便的 method 來改變 WorkingMemory

    modify(obj) ”:告訴引擎一個對象已經發生變化,規則必須重新匹配( obj 對象必須是出現在 LHS 中的對象);

    assert(new Something()) ”:將一個新的 Something 對象加入 WorkingMemory

    assertLogical(new Something()) ”:與 assert 方法類似。但是,當沒有 fact 支持當前激發規則的真實性的時候,這個新對象會自動被 retract

    retract(obj) ”:從 WorkingMemory 中移除一個對象。

    這些方法都是宏指令,提供了到 KnowledgeHelper 實例的快捷方式(參考 KnowledgeHelper 接口)。 KnowledgeHelper 接口可以在 RHS 代碼塊中調用,通過變量“ drools ”。如果你在 assert 進引擎的 JavaBean 中加入“ Property Change Listener ”,在對象發生變化的時候,你就不用調用“ modify ”方法。

    5.3 Rule Attributes


    Figure?5.4.?rule attributes

    5.3.1 no-loop

    默認值: false

    類型: boolean

    當在 rule RHS 中修改了一個 fact ,這可能引起這個 rule 再次被 activate ,引起遞歸。將 no-loop 設為 true ,就可以防止這個 rule Activation 的再次被創建。

    5.3.2 salience

    默認值: 0

    類型: int

    每個 rule 都可以設置一個 salience 整數值,默認為 0 ,可以設為正整數或負整數。 Salience 是優先級的一種形式。當處于 Activation 隊列中時,擁有高 salience 值的 rule 將具有更高的優先級。

    5.3.3 agenda-group

    默認值: MAIN

    類型: String

    Agenda group 允許用戶對 Agenda 進行分組,以提供更多的執行控制。只有具有焦點的組中的 Activation 才會被激發( fire )。

    5.3.4 auto-focus

    默認值: false

    類型: boolean

    當一個規則被 activate (即 Activation 被創建了),如果這個 rule auto-focus 值為 true 并且這個 rule agenda-group 沒有焦點,此時這個 Activation 會被給予焦點,允許這個 Activation fire 的潛在可能。

    5.3.5 activation-group

    默認值: N/A

    類型: String

    當處于同一個 activation-group 中的第一個 Activation fire 后,這個 activation-group 中其余剩下的 Activation 都不會被 fire

    5.3.6 duration

    默認值:沒有默認值

    類型: long

    5.4 Column


    Figure?5.5.?Column

    Example?5.1.?Column

    Cheese(?)
    Cheese(?type?
    == ? " stilton " ,?price? < ? 10 ?)

    一個 Column 由一個類的一個或多個域約束構成。第一個例子沒有約束,它將匹配 WorkingMemory 中所有的 Cheese 實例。第二個例子對于一個 Cheese 對象有兩個字面約束( Literal Constraints ),它們被用“,”號隔開,意味著“ and ”。


    Figure?5.6.?Bound Column

    Example?5.2.?Bound Column

    cheapStilton?:?Cheese(?type? == ? " stilton " ,?price? < ? 10 ?)

    這個例子同前一個例子有點類似。但是在這個例子中,我們將一個變量綁定到匹配規則引擎的 Cheese 實例上。這意味著,你可以在另一個條件中使用 cheapStilton ,或者在 rule RHS 中。

    5.4.1 Field Constraints

    Field Constraints 使規則引擎可以從 WorkingMemory 中挑選出合適的 Fact 對象。一個 Fact 的“ Field ”必須符合 JavaBean 規范,提供了訪問 field getter 方法。你可以使用 field 的名字直接訪問 field ,或者使用完整的方法名(省略括號)。

    例如,以我們的 Chess 類為例,下面是等價的: Cheese(type = = …) Cheese(getType = = …) 。這意味著,你可以使用不太嚴格遵守 JavaBean 規范對象。盡管如此,你要保證 accessor 方法是不帶參數的,以保證它不會改變對象的狀態。

    注意:如果一個 field 使用原始類型( primitive type ), Drools 將會把它們自動裝箱成相應的對象(即使你使用 java 1.4 ),但是在 java 1.4 下卻不能自動拆箱。總的來說,盡量在 rule 所使用的類中,使用非原始類型的域。如果是使用 java 5 ,就可以比較隨意了,因為編譯器會幫你執行自動裝拆箱。

    5.4.1.1 Operators


    Figure?5.7.?Operators

    有效的操作符是同域類型相關的。例如,對于日期域,“ < ”意味著“之前”。“ matches ”只適用于 String 域,“ contains ”和“ excludes ”只適用于 Collection 類型域。

    5.4.1.2 字面值約束( Literal Constraints

    最簡單的域約束就是字面值約束,允許用戶將一個 field 約束于一個已知值。

    注意:你可以檢查域是否為 null ,使用 = = != 操作符和字面值‘ null ’關鍵字。如, Cheese(type != null) 。字面值約束,特別是“ = = ”操作符,提供了非常快的執行速度,因為可以使用散列法來提高性能。


    Figure?5.8.?Literal Constraints

    Numeric

    所有標準的 Java 數字基本類型都可以用。

    有效操作符:

    ·???????? ==

    ·???????? !=

    ·???????? >

    ·???????? <

    ·???????? >=

    ·???????? <=

    Example?5.3 .?Numeric Literal Constraint
    Cheese(?quantity? == ? 5 ?)

    Date

    當前只對“ dd-mm-yyyy ”的日期格式提供默認支持。你可以通過指定 drools.dateformat 系統屬性,來改變默認的日期格式。如果需要更多的控制,要用謂詞約束( Predicate Constraint )。

    有效操作符:

    ·???????? ==

    ·???????? !=

    ·???????? >

    ·???????? <

    ·???????? >=

    ·???????? <=

    Example?5.4.?Date Literal Constraint
    Cheese(?bestBefore? < ? " 27-Oct-2007 " ?)

    String

    可以使用任何有效的 Java String

    有效操作符:

    ·???????? ==

    ·???????? !=

    Example?5.5.?String Literal Constraint
    Cheese(?type? == ? " stilton " ?)

    Boolean

    只能用 true ”或“ false ”。 0 1 不能被識別,而且 Cheese(smelly) 也是不被允許的。

    有效操作符:

    ·???????? ==

    ·???????? !=

    Example?5.6?Boolean Literal Constraint
    Cheese(?smelly? = ? = ? true ?)

    Matches Operator

    Matches 操作符后面可以跟任何有效的 Java 正則表達式。

    Example?5.7.?Regular Expression Constraint
    Cheese(?type?matches? " (Buffulo)?\\S*Mozerella " ?)

    Contains Operator and Excludes Operator

    contains ”和“ excludes ”可以用來檢查一個 Collection 域是否含有一個對象。

    Example?5.8.?Literal Cosntraints with Collections
    CheeseCounter(?cheeses?contains? " stilton " ?)
    CheeseCounter(?cheeses?excludes?
    " chedder " ?)

    5.4.1.3 Bound Variable Constraint

    可以將 Facts 和它們的 Fields 附給一個 Bound Variable ,然后在后續的 Field Constraints 中使用這些 Bound Variable 。一個 Bound Variable 被稱為聲明( Declaration )。 Declaration 并不能和“ matches ”操作符合用,但卻可以和“ contains ”操作符合用。

    Example?5.9.?Bound Field using '==' operator
    Person(?likes?:?favouriteCheese?)
    Cheese(?type?
    == ?likes?)

    在上面的例子中,“ likes ”就是我們的 Bound Variable ,即 Declaration 。它被綁定到了任何正在匹配的 Person 實例的 favouriteCheese 域上,并且用來在下一個 Column 中約束 Cheese type 域。可以使用所有有效的 Java 變量名,包括字符“ $ ”。“ $ ”經常可以幫助你區分 Declaration field 。下面的例子將一個 Declaration 綁定到匹配的實例上,并且使用了“ contains ”操作符。注意: Declaratino 的第一個字符用了“ $ ”:

    Example?5.10?Bound Fact using 'contains' operator

    $stilton?:?Cheese(?type? == ? " stilton " ?)
    Cheesery(?cheeses?contains?$stilton?)

    5.4.1.4 Predicate Constraints



    Figure?5.9.?Predicate expression

    Predicate 表達式可以使用任何有效的 Java 邏輯表達式。先前的 Bound Declaration 可以用在表達式中。

    下面的例子將會找出所有男性比女性大 2 歲的 pairs of male/femal people

    Example?5.11. Predicate Constraints

    Person(?girlAge?:?age,?sex? = ? = ? " F " ?)
    Person(?boyAge?:?age?
    -> ?(?girlAge.intValue()? + ? 2 ? == ?boyAge.intValue()?),?sex? = ? = ? " M " ?)

    5.4.1.5 Return Value Constraints



    Figure?5.10.?Return Value expression

    一個 Retrurn Value 表達式可以使用任何有效的 Java 表達式,只要它返回一個對象,不能返回原始數據類型。如果返回值是原始數據類型,要先進行裝箱。先前的 Bound Declaration 也可以使用在表達式中。

    下面的例子跟上一節的例子一樣,也將會找出所有男性比女性大 2 歲的 pairs of male/femal people 。注意:這里我們不用綁定 boyAge ,增加了可讀性:

    Example?5.12.?Return Value Constraints
    Person(?girlAge?:?age,?sex? = ? = ? " F " ?)
    Person(?age?
    = ? = ?(? new ?Integer(girlAge.intValue()? + ? 2 )?),?sex? = ? = ? " M " ?)

    5.5 Conditional Elements

    Conditional Elements 用來連接一個或多個 Columns

    5.5.1 and

    Figure?5.11.?and

    Example?5.13. ?And
    Cheese(?cheeseType?:?type?)? && ?Person(?favouriteCheese? == ?cheeseType?)
    Cheese(?cheeseType?:?type?)?and?Person(?favouriteCheese?
    == ?cheeseType?)

    5.5.2 or


    Figure?5.12.?or
    Example?5.14.?or
    Person(?sex? == ? " f " ,?age? > ? 60 ?)? || ?Person(?sex? == ? " m " ,?age? > ? 65 ?)
    Person(?sex?
    == ? " f " ,?age? > ? 60 ?)?or?Person(?sex? == ? " m " ,?age? > ? 65 ?)



    Figure?5.13.?or with binding

    Example?5.15.?or with binding
    pensioner?:?Person(?sex? == ? " f " ,?age? > ? 60 ?)? || ?pensioner?:?Person(?sex? == ? " m " ,?age? > ? 65 ?)?
    pensioner?:?(?Person(?sex?
    == ? " f " ,?age? > ? 60 ?)?or?Person(?sex? == ? " m " ,?age? > ? 65 ?)?)

    or Conditional Element 的使用會導致多條 rule 的產生,稱為 sub rules 。上面的例子將在內部產生兩條規則。這兩條規則會在 WorkingMemory 中各自獨立的工作,也就是它們都能進行 match activate fire 。當對一個“ or Conditional Element 使用變量綁定時,要特別小心,錯誤的使用將產生完全不可預期的結果。

    可以將“ OR Conditional Element 理解成產生兩條規則的快捷方式。因此可以很容易理解,當“ OR Conditional Element 兩邊都為真時,這樣的一條規則將可能產生多個 activation

    5.5.3 eval


    Figure?5.14 .?eval

    Eval is essentially a catch all which allows any semantic code (that returns a primitive boolean) to be executed. 在表達式中可以引用在 LHS 中出現的變量,和在 rule package 中的 Functions 。一個 Eval 應該是 LHS 中的最后一個 Conditional Element 。在一個 rule 中,你可以有多個 eval

    Eval 不能被索引,因此不能像 Field Constraints 那樣被優化。盡管如此,當 Functions 的返回值一直在變化時,應該使用 Eval ,因為這在 Field Constraints 中時不允許的。如果規則中的其他條件都匹配,一個 eval 每次都要被檢查。(現在還不理解到底 eval 要怎么用?)

    Example?5.16.?eval

    p1?:?Parameter()?
    p2?:?Parameter()
    eval(?p1.getList().containsKey(p2.getItem())?)
    eval(?isValid(p1,?p2)?)?
    // this?is?how?you?call?a?function?in?the?LHS?-?a?function?called? // "isValid"

    5.5.4 not


    Figure?5.15.?not

    not ”是一階邏輯的存在量詞( first order logic’s Existential Quantifier , 用來檢查 WorkingMemory 中某對象的非存在性。現在,只有 Columns 可以放在 not 中,但是將來的版本會支持“ and ”和“ or ”。

    Example?5.17.?No Buses

    not?Bus()

    Example?5.18.?No red Buses

    not?Bus(color? == ? " red " )
    not?(?Bus(color?
    == ? " red " ,?number? = ? = ? 42 )?)? // brackets?are?optional

    5.5.5 exists


    Figure?5.16.?exists

    exists 是一階邏輯的存在量詞( first order logic’s Existential Quantifier ),用來檢查 WorkingMemory 中某對象的存在性。可以將“ exists ”理解為“至少有一個”( at least one… )。它的意義不同于只有 Column 本身,“ Column ”本身可以理解為“對于每一個 ”( for each of … )。如果你對一個 Column 使用了“ exists ”,那么規則將只 activate 一次,而不管 WorkingMeomry 中有多少個數據匹配了那個條件。

    現在,只有 Columns 可以放在“ exists ”中,但是將來的版本會支持“ and ”和“ or ”。

    Example?5.19.?At least one Bus

    exists?Bus()

    Example?5.20.?At least one red Bus

    exists?Bus(color? == ? " red " )

    5.5.6 group


    Figure?5.17.?group

    Group 的作用相當于代數學中的“()”,顯式的指明操作的順序。

    5.6 再談自動裝箱和原始類型

    Java 5 支持在原始類型與其對應包裝類之間的裝拆箱。盡管如此,因為要讓 drools 能夠在 J2SE 1.4 下運行,我們不能依靠 J2SE 。因此, drools 自己實現了自動裝箱。被引用(即被 Bound Variable 綁定)的 Field 將被自動進行裝箱(如果它們本身就是 object ,就不會有任何變化)。盡管如此,必須要注意的是,他們并不會被自動拆箱。

    還有一點要注意的,就是對于 ReturnValue Constraints ,返回值的代碼必須返回一個對象,而不能是一個原始類型。

    6 Query


    Figure?6.1 .?query

    一個 query 只包含了一個 rule LHS 結構(你不用指定“ when ”或“ then ”)。這是查詢 WorkingMemory 中匹配條件的 Facts 的簡單的方法。

    要得到結果,要使用 WorkingMemory.getQueryResults(“name”) 方法,其中“ name ”就是 query 的名字。 Query 的名字在 RuleBase 中是全局的,所以, do not add queries of the same name to different packages for the same RuleBase

    下面的例子創建了一個簡單的 query 來查詢所有年齡大于 30 的人:

    Example?6.1.?Query People over the age of 30
    ?
    query?"people?over?the?age?of?30"?
    ????person?:?Person(?age?
    >?30?)
    end

    我們通過一個標準的循環來迭代一個返回的QueryResults對象。每一次的iterate將返回一個QueryResult對象。我們可以用QueryResult對象的get()方法來訪問每個Column,通過傳入Bound Declarationindex position

    Example?6.2.?Query People over the age of 30

    QueryResults?results?=?workingMemory.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?(?Iterator?it?=?results.iterator;?it.hasNext();?)?{
    ????QueryResult?result?
    =?(?QueryResult?)?it.next();
    ????Person?person?
    =?(?Person?)?result.get(?"person"?);
    ????System.out.println(?person.getName()?
    +?"\n"?);
    }


    posted on 2006-06-09 19:38 guangnian 閱讀(15780) 評論(17)  編輯  收藏 所屬分類: JBoss Rules(Drools)

    評論

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2006-06-10 01:22 quaff

    一直在關注這個系列的文章,謝謝樓主  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2006-06-11 10:53 kebo

    希望樓主講講規則怎么解決沖突的問題和規則怎么和系統交互(我覺得在規則中修改facts是不怎么好,你有什么心得),另外規則怎么表達現實中的規則描述。
    再次謝謝樓主的貢獻  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2006-06-18 10:26 armstrong

    非常不錯!期待更深層次的應用!如果結合實例,效果會更好!樓主圖文并茂,用心良苦。  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2006-12-07 11:26 yolanda[匿名]

    那個regexp好像沒講哦  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2006-12-07 11:28 yolanda[匿名]

    Person( boyAge : age -> ( girlAge.intValue() + 2 == boyAge.intValue() ), sex = = " M " )
    這句話的意思不明白
    還有為什么突然提到"自動裝箱呢"   回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2007-05-15 15:10 edisonrf

    就是翻譯drools的user manual  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2007-07-04 11:15 xjhdcy

    不錯 不錯
    如果有個應用實例就能錦上添花了  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2007-07-20 12:48 萬里

    哈哈哈哈哈

      回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2007-07-20 12:49 萬里

    Person( boyAge : age -> ( girlAge.intValue() + 2 == boyAge.intValue() ), sex = = " M " )






    ??????????????????????  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下)[未登錄] 2007-09-22 12:49 tony

    漂亮!  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下)[未登錄] 2008-05-28 13:45 fish

    雁過留聲  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2008-09-07 17:09 yyy

    能舉一個例子嗎,Drools對規則庫的大小有沒有限制?  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2008-09-18 15:28 游龍

    一定要冒個泡!
    寫得很不錯!翻譯也是比較準確,幫了不少忙!謝謝again!  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2008-09-18 15:30 游龍

    @yyy
    Large drl files
    Depending on the JDK you use, it may be necessary to increase the permanent
    generation max size. Both SUN and IBM jdk have a permanent generation, whereas
    BEA JRockit does not.

    To increase the permanent generation, start eclipse with -XX:MaxPermSize=###m

    Example: c:\eclipse\eclipse.exe -XX:MaxPermSize=128m

    Rulesets of 4,000 rules or greater should set the permanent generation to
    atleast 128Mb.  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2009-07-20 11:59 Toby

    請問下,drools4和web一起用可以嗎,現在的規則描述都在drl文件中,可否通過web的方式,來動態修改規則,如果讓用戶直接來修改規則文件可能有點困難。請問是否有相關例子?謝謝。  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2010-07-21 14:20 blacksister

    解了我的燃眉之急啊。想知道的都知道了。  回復  更多評論   

    # re: JBoss Rules 學習(七): Drools規則語言詳解(下) 2010-10-21 17:46 齊先生

    樓主辛苦了,謝謝樓主  回復  更多評論   

    主站蜘蛛池模板: 亚洲精品天堂在线观看| 在线免费观看一级片| 猫咪免费观看人成网站在线| 亚洲永久永久永久永久永久精品| 免费大黄网站在线看| 好先生在线观看免费播放 | 亚洲经典在线中文字幕| 亚洲伊人久久成综合人影院| 猫咪社区免费资源在线观看| 8x成人永久免费视频| a级成人毛片免费视频高清| 老司机午夜在线视频免费观| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲av综合av一区| 国产成人精品日本亚洲专区| 在线观看国产情趣免费视频| 国内免费高清在线观看| 中文字幕无码免费久久99| 亚洲精品夜夜夜妓女网| 国产男女猛烈无遮挡免费视频 | 7777久久亚洲中文字幕蜜桃| 国产AV无码专区亚洲AV毛网站| 国产乱辈通伦影片在线播放亚洲 | 一个人看的免费视频www在线高清动漫 | 一级特黄特色的免费大片视频| 日韩精品亚洲专区在线影视| 亚洲日韩av无码中文| 亚洲午夜久久久久妓女影院| 亚洲国产一区明星换脸| 亚洲精品成人片在线观看| 亚洲欧洲精品成人久久曰影片 | 免费国产黄网站在线观看动图 | 欧洲美熟女乱又伦免费视频| 午夜一区二区免费视频| 日本免费网站在线观看| 免费无遮挡无码永久在线观看视频| 日本媚薬痉挛在线观看免费| 四虎永久在线精品免费影视| 免费人成视频在线观看视频| 久久久久国产成人精品亚洲午夜 | 婷婷国产偷v国产偷v亚洲|