【java】drools入门之LHS和RHS语法
很自然地,筆者將分成兩部分進行講解。
1. LHS語法
LHS 是規則條件部分的統稱,由 0 個或多個條件元素組成。前面我們已經提到,如果沒有條件元素那么默認就是true。
1.1 Pattern 綁定
當匹配到對象時,可以將 FACT 對象綁定到指定的變量上。這里的用法類似于 java 的變量定義。綁定之后,在后面就可以直接使用此變量。
rule ...when$p : Person()thenSystem.out.println( "Person " + $p );end // 2 person 的 age 屬性值相同 Person( $firstAge : age ) // 綁定 Person( age == $firstAge ) // 約束表達式?其中,前綴$只是一個約定標識,有助于在復雜的規則中輕松區分變量和字段,但并不強制要求必須添加此前綴。
1.2 訪問 JavaBean 中的屬性
任何一個 JavaBean 中的屬性都可以訪問,不過對應的屬性要提供 getter 方法或isProperty 方法。比如:
Person( age == 50 ) // 與上面擁有同樣的效果 Person( getAge() == 50 )1.3 內部類分組訪問
通常情況,我們訪問一個內部類的多個屬性時會有如下的寫法:?
Person( name == "mark", address.city == "london", address.country == "uk" )1.4 Java 表達式
在 pattern 的約束條件中,可以任何返回結果為布爾類型的 java 表達式。當然,java 表達式也可以和增強的表達式進行結合使用,比如屬性訪問。可以通過使用括號來更改計算優先級,如在任一邏輯或數學表達式中。?
Person( age > 100 && ( age % 10 == 0 ) )也可以直接使用 java 提供的工具方法來進行操作計算:
Person( Math.round( weight / ( height * height ) ) < 25.0 )在使用的過程中需要注意,在 LHS 中執行的方法只能是只讀的,不能在執行方法過程中改變 FACT 對象的值,否則會影響規則的正確執行。
1.5?matches 正則表達式
可使用 Java 的正則表達式進行字符串的匹配,通常情況下使用正則表達式字符串進行匹配,但也支持變量值為正確的表達式的方式。此操作符僅適用于字符串屬性。如果屬性值為 null,匹配的結果始終為 false。
Cheese( type matches "(Buffalo)?\\S*Mozzarella" )not matches 方法與 matches 相同,唯一不同的是返回的結果與之相反。
Cheese( type not matches "(Buffalo)?\\S*Mozzarella" )1.6?contains 和 memberOf 操作符
contains 判斷一個集合屬性或元素是否包含指定字符串或變量值。僅適用于集合屬性。也可以用于替代 String.contains()來檢查約束條件。not contains 用法與之相同,結果取反。
CheeseCounter( cheeses contains "stilton" ) // 包含字符串 CheeseCounter( cheeses contains $var ) // 包含變量 Cheese( name contains "tilto" ) Person( fullName contains "Jr" ) String( this contains "foo" )memberOf 用來檢查屬性值是否為集合,此集合的表示必須為變量。not memberOf 使用方法相同,結果取反。
CheeseCounter( cheese memberOf $matureCheeses )1.7 字符串操作符?str 和 in
str 操作用來比較一個字符串是否以指定字符串開頭或結尾,有可以用于比較字符串的長度。
Message( routingValue str[startsWith] "R1" ) Message( routingValue str[endsWith] "R2" ) Message( routingValue str[length] 17 )in 和 notin 用來匹配一組數據中是否含一個或多個匹配的字符串,使用的方法與數據庫中 in 的使用方法相似。待匹配的數據可以是字符串、變量。
Person( $cheese : favouriteCheese ) Cheese( type in ( "stilton", "cheddar", $cheese ) )?2. THS語法
RHS 是滿足 LHS 條件之后進行后續處理部分的統稱,該部分包含要執行的操作的列表信息。RHS 主要用于處理結果,因此不建議在此部分再進行業務判斷。如果必須要業務判斷需要考慮規則設計的合理性,是否能將判斷部分放置于 LHS,那里才是判斷條件應該在的地方。
同時,應當保持 RHS 的精簡和可讀性。如果在使用的過程中發現需要在 RHS 中使用 AND 或 OR 來進行操作,那么應該考慮將
一根規則拆分成多個規則。RHS 的主要功能是對 working memory 中的數據進行 insert、update、delete 或 modify 操作,Drools 提供了相應的內置方法來幫助實現這些功能。下面分別介紹:
2.1??insert 函數
insert 的作用與在 Java 類當中調用 KieSession 的 insert 方法效果一樣,都是將 Fact 對象插入到當前的 Working Memory 當中,基本用法格式如下:
insert(newSomething());調用 insert 之后,規則會進行重新匹配,如果沒有設置 no-loop 為 true 或 lock-on-active?為 true 的規則,如果條件滿足則會重新執行。update、modify、delete 都具有同樣的特性,因此在使用時需特別謹慎,防止出現死循環。
規則文件 insert.drl
package com.rulesimport com.secbro.drools.model.Productrule "insert-check"salience 1when$p : Product(type == GOLD);thenSystem.out.println("insert-check:insert Product success and it's type is " + $p.getType());endrule "insert-action"salience 2whenthenSystem.out.println("insert-action : Toinsert the Product");Product p = new Product();p.setType(Product.GOLD);insert(p); end打印日志:?
insert-action : To insert the Product insert-check:insert Product success and it's type is GOLD Fire 2 rules! 根據優先級首先執行 insert 操作的規則,然后執行結果檢測。2.2?update 函數
update 函數可對 Working Memory 中的 FACT 對象進行更新操作,與 StatefulSession 中的 update 的作用基本相同。查看 KnowledgeHelper 接口中的 update 方法可以發現,update函數有多種參數組合的使用方法。在實際使用中更多的會傳入 FACT 對象來進行更新操作。
2.3 delete 函數
將 Working Memory 中的 FACT 對象刪除,與 kession 中的 retract/delete 方法效果一樣。同時 delete 函數和 retract 效果也相同,但后者已經被廢棄。
2.4??modify 函數
modify 是基于結構化的更新操作,它將更新操作與設置屬性相結合,用來更改 FACT 對象的屬性。語法格式如下:
modify ( <fact-expression> ) {<expression> [ , <expression> ]* }其中<fact-expression>必須是 FACT 對象的引用,expression 中的屬性必須提供 setter 方法。在調用 setter 方法時,不必再寫 FACT 對象的引用,編譯器會自動添加。
rule "modify stilton"when$stilton : Cheese(type == "stilton")thenmodify( $stilton ){setPrice( 20 ),setAge( "overripe" )} end更多內容可以訪問大佬的博客:http://blog.csdn.net/wo541075754
總結
以上是生活随笔為你收集整理的【java】drools入门之LHS和RHS语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据科学】05 数据合并(merge、
- 下一篇: 关于会声会影导入视频出现卡顿花屏的解决办