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

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

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

    隨筆-61  評論-159  文章-0  trackbacks-0

    原文:http://www.javaeye.com/topic/190294
    一個典型的DRL文件:
    Java代碼
    ①package com.sample   //包名,不可以與關鍵字沖突  
    ②import com.sample.DroolsTest.Message;//本文件需要導入的類  
    ③global java.util.List myGlobalList;//全局變量  
    ④//定義函數體  
    function String hello(String name) {  
        return "Hello "+name+"!";  
    }  
     
    ⑤rule "myRule"    
    no-loop true  //執行一次后,是否能被再次激活  
    salience 100  //優先級別  
    ⑥when    
    m : Message( status == Message.HELLO, message : message )   
    ⑦then      
    m.setMessage( "Goodbye cruel world" );  
            m.setStatus( Message.GOODBYE );  
            update( m );  
        myGlobalList.add( "Hello World" );//使用global 變量  
        System.out.println( hello( "Bob" ) );//調用定義函數  
    End 

    ①package com.sample   //包名,不可以與關鍵字沖突
    ②import com.sample.DroolsTest.Message;//本文件需要導入的類
    ③global java.util.List myGlobalList;//全局變量
    ④//定義函數體
    function String hello(String name) {
        return "Hello "+name+"!";
    }

    ⑤rule "myRule" 
    no-loop true  //執行一次后,是否能被再次激活
    salience 100  //優先級別
    ⑥when 
    m : Message( status == Message.HELLO, message : message )
    ⑦then   
    m.setMessage( "Goodbye cruel world" );
      m.setStatus( Message.GOODBYE );
      update( m );
        myGlobalList.add( "Hello World" );//使用global 變量
        System.out.println( hello( "Bob" ) );//調用定義函數
    End

     

    ①package com.sample
    包名,不可以與關鍵字沖突。一個包通過名稱空間描繪,這樣很好的保持了一組規則的獨立性。
    ②import
    標記就像java中的含義一樣。對于任何要用在規則中的對象,你需要指定完整的路徑和類型名。Drools從同名的java包中自動導入類。
    ③global
    如果多個包定義了同樣名稱的全局變量,它們必須使用同樣的類型,并且全部指向同一個全局值。全部變量通常用來返回數據,獲得提供數據或服務給規則使用。為了使用全局變量,你必須:
    在規則文件中聲明全局變量并使用它,如:
    global java.util.List myGlobalList;
    rule "Using a global"
    when
        eval( true )
    then
        myGlobalList.add( "Hello World" );
    end
    在working memory上設置全局變量的值。最好是在將fact插入working memory之前設置完所有全局變量,如:
    List list = new ArrayList();
    WorkingMemory wm = rulebase.newStatefulSession();
    wm.setGlobal( "myGlobalList", list );
    ④function
    相對于正常的java類,函數是在你的規則代碼中放置語言代碼的方法。它們不可能做任何超過你可以在幫助類(在java中定義,被設置入規則的Working Memory中的類)中做到的事情。使用函數的優點是可以將邏輯保存在一個地方,并且你可以在需要的時候改變函數(這樣做各有優缺點)。函數最大的用處是被規則的推論(then)部分中的行為所調用,特別是當一個行為操作需要反復被調用時(將公用代碼抽取出來成為一個函數)。
    ⑤rule 名稱可以在“”下取任何名字。
    屬性列表:
    屬性 類型 默認值 功能描述
    no-loop Boolean false 設置no-loop為true可以阻止該規則被再次激活。
    salience integer 0 優先級數字高的規則會比優先級低的規則先執行。
    agenda-group String MAIN 只有在具有焦點的agenda group中的規則才能夠激發。
    auto-focus Boolean false 如果該規則符合激活條件,則該規則所在agenda-group自動獲得焦點,允許規則激發。
    activation-group String N/A 在同名activation-group中的規則將以互斥的方式激發
    dialect String "java" or "mvel" 指定在LHS代碼表達式或RHS代碼塊中使用的語言。
    date-effective String, 包含日期/時間定義 N/A 規則只能在date-effective指定的日期和時間之后激活。
    date-exptires String, 包含日期/時間定義 N/A 如果當前時間在date-expires指定的時間之后,規則不能激活。

    duration long N/A 指出規則將在指定的一段時間后激發,如果那個時候規則的激活條件還是處于true的情況下。
    ⑥  LHS (when) 條件元素
    為了能夠引用匹配的對象,使用一個模式綁定變量如‘$c’。變量的前綴使用的$是可選的,但是在復雜的規則中它會很方便用來區別變量與字段的不同。
    $c : Cheese( type == "stilton", price < 10, age == "mature" )
    && 和|| 約束連接符
    Cheese( type == "stilton" && price < 10, age == "mature" )
    Cheese( type == "stilton" || price < 10, age == "mature" )
    第一個有兩個約束而第二個組有一個約束,可以通過圓括號來改變求值的順序。
    單值約束
    Matches 操作
    Cheese( type matches "(Buffalo)?\S*Mozerella" )
    Cheese( type not matches "(Buffulo)?\S*Mozerella" )
    Contains 操作
    CheeseCounter( cheeses contains "stilton" )
    CheeseCounter( cheeses not contains "cheddar" )
    memberof操作
    CheeseCounter( cheese memberof $matureCheeses )
    CheeseCounter( cheese not memberof $matureCheeses )
    字符串約束
    字符串約束是最簡單的約束格式,將字段與指定的字符串求值:數值,日期,string或者boolean。
    Cheese( quantity == 5 )
    Cheese( bestBefore < "27-Oct-2007" )
    Cheese( type == "stilton" )
    Cheese( smelly == true )
    綁定變量約束
    變量可以綁定到Fact和它們的字段,然后在后面的字段約束中使用。綁定變量被稱為聲明。有效的操作符由被約束的字段類型決定;在那里會進行強制轉換。綁定變量約束使用'=='操作符,因為能夠使用hash索引,因此提供非??斓膱绦兴俣?。
    Person( likes : favouriteCheese )
    Cheese( type == likes )
    返回值約束
    返回值約束可以使用任何有效的Java元數據類型或對象。要避免使用任何Drools關鍵字作為聲明標識。在返回值約束中使用的函數必須返回靜態常量(time constant)結果。之前聲明的綁定可以用在表達式中。
    Person( girlAge : age, sex == "F" )
    Person( age == ( girlAge + 2) ), sex == 'M' )
    復合值約束
    復合值約束用在可能有多個允許值的時候,當前只支持'in' 和'not in'兩個操作。這些操作使用圓括號包含用逗號分開的值的列表,它可以是變量,字符串,返回值或限定標識符。'in' 和'not in'運算式實際上被語法分析器重寫成多個!= and ==組成的多重約束。
    Person( $cheese : favouriteCheese )
    Cheese( type in ( "stilton", "cheddar", $cheese )
    多重約束
    多重約束允許你對一個字段通過使用'&&' 或者'||'約束連接符進行多個約束條件的判斷。允許使用圓括號分組,它會讓這種約束看起來更自然。
    Person( age ( (> 30 && < 40) || (> 20 && < 25) ) )
    Person( age > 30 && < 40 || location == "london" )
    內聯的Eval約束
    eval約束可以使用任何有效的語言表達式,只要它最終能被求值為boolean元數據類型。表達式必須是靜態常量(time constant)。任何在當前模式之前定義的變量都可以使用,自動代入(autovivification)機制用來自動建立字段綁定變量。當構建器發現標識不是當前定義的變量名是,它將嘗試將它作為對象的字段來訪問,這種情況下,構建器自動在inline-eval中建立該字段的同名變量。
    Person( girlAge : age, sex = "F" )
    Person( eval( girlAge == boyAge + 2 ), sex = 'M' )

    ⑦RHS (then) 執行操作
    這部分應當包含一系列需要執行的操作。規則的RHS部分應該保持簡短的,這保持它是聲明性和可讀性的。如果你發現你需要在RHS中使用命令式或and/or條件代碼,那你可能需要將規則拆分為多個規則。RHS的主要目的是插入,刪除修改working memory數據。
    "update(object, handle);" 將告訴引擎對象已經改變(已經被綁定到LHS中的那一個),并且規則需要重新檢查。
    "insert(new Something());" 將在working memory中放置一個你新建的對象。
    "insertLogical(new Something());" 與insert類似,但是當沒有更多的fact支持當前激發規則的真值狀態時,對象自動刪除。
    "retract(handle);" removes an object from working memory.
    ⑧ Query
    查詢中僅僅包含規則LHS部分的結構(不用指定when或then)。它提供了查詢working memory 中符合約束條件的對象的一個簡單辦法。
    query "people over the age of 30"
        person : Person( age > 30 )
    end
    通過在返回的查詢結果(QueryResults)上進行標準的for循環遍歷,每一行將返回一個QueryResult,該對象可以用來存取組元中的每一個Column。這些Column可以通過聲明的名稱或索引位置存取。
    QueryResults results = workingMemory.getQueryResults( "people over the age of 30" );
    for ( Iterator it = results.iterator; it.hasNext(); ) {
        QueryResult result = ( QueryResult ) it.next();
        Person person = ( Person ) result.get( "person" );
        }

     



    -------------------------------------------------------------------------------------------------
    PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者文章的詳細出處地址,否則不允許轉載,多謝合作!
    posted on 2010-01-17 21:11 apple0668 閱讀(4271) 評論(0)  編輯  收藏 所屬分類: drools

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲欧美不卡高清在线| 不卡视频免费在线观看| 韩国日本好看电影免费看| 成人免费网站在线观看| 美女裸体无遮挡免费视频网站| aa在线免费观看| 国产成人综合亚洲AV第一页| 亚洲免费观看网站| 男女免费观看在线爽爽爽视频| 亚洲午夜精品久久久久久浪潮| 黄网站色视频免费观看45分钟 | 中国人免费观看高清在线观看二区 | 亚洲精品乱码久久久久久下载| 亚洲视频无码高清在线| 亚洲理论电影在线观看| 4虎永免费最新永久免费地址| 久久WWW免费人成—看片| 亚洲成熟xxxxx电影| 啦啦啦完整版免费视频在线观看| 免费无码又爽又刺激高潮| 亚洲熟妇久久精品| 成年轻人网站色免费看| 青青青视频免费观看| 精品亚洲永久免费精品| 一级毛片免费毛片一级毛片免费| 亚洲综合一区二区精品久久| 中国在线观看免费国语版| 亚洲精品无码mⅴ在线观看| 日本高清不卡中文字幕免费| 亚洲中文字幕无码爆乳av中文| 东方aⅴ免费观看久久av| 黑人精品videos亚洲人| 久草免费在线观看视频| 鲁死你资源站亚洲av| 一个人在线观看视频免费| 99亚洲精品卡2卡三卡4卡2卡| 亚洲第一视频在线观看免费| 色爽黄1000部免费软件下载| 亚洲精品无AMM毛片| 拍拍拍无挡视频免费观看1000| 亚洲国产精品一区二区三区久久|