Drools開源業務規則引擎(二)- Drools規則語言(DRL)


文章目錄

    • 1.DRL文件的組成:
    • 2.package
    • 3.import
    • 4.function
    • 5.query
    • 6.declare
    • 7.global
    • 8.rule
      • 8.1.規則屬性
      • 8.2.LHS
        • 8.2.1.語法格式
        • 8.2.2.運算符優先級
        • 8.2.3.特殊的運算符
          • 1.`matches`, `not matches`
          • 2.`contains`, `not contains`
          • 3.`memberOf`, `not memberOf`
          • 4.`in`, `notin`
          • 5.`soundslike`
          • 6.`str`
          • 7.`from`
      • 8.3.RHS
        • 8.3.1.`set`
        • 8.3.2.`modify`
        • 8.3.3.`update`
        • 8.3.4.`insert`
        • 8.3.5.`delete`
        • 8.3.6.`drools.halt()`


1.DRL文件的組成:

在官方文檔中(鏈接地址 https://docs.drools.org/7.74.1.Final/drools-docs/html_single/index.html#_droolslanguagereferencechapter),DRL的組成如下:

packageimportfunction  // Optionalquery  // Optionaldeclare   // Optionalglobal   // Optionalrule "rule name"// Attributeswhen// Conditionsthen// Actions
endrule "rule2 name"...

以上內容,只是梳理了DRL文件中組成的元素及其順序(順序非強制性要求,這是這樣便于內容閱讀)。

2.package

類似于 Java 中的 package,聲明規則的唯一命名空間(包)。包必須有一個名稱空間,并使用包名稱的標準 Java 約定進行聲明;即沒有空格,這與允許空格的規則名稱不同。根據元素的順序,它們可以以任何順序出現在規則文件中,但package語句除外,它必須位于文件的頂部。在任何情況下,分號都是可選的。

任何規則屬性(見“規則屬性”一節)也可以在包級別編寫,取代該屬性的默認值。修改后的默認值仍可能被規則中的屬性設置所替換。

示例

// 帶分號
package com.test;
// 不帶分號
package com.test

3.import

類似于 Java 中的 import。DRL文件中在規則中需要導入使用的對象的完全限定路徑和類型名稱。Drools引擎自動從與DRL包同名的Java包和Java.lang包中導入類。

示例

// 不需要導入,已自動導入
// import java.lang.String;import com.a.b.DroolsObject;

4.function

類似于 Java 中的 method。可以將重復代碼或者邏輯性代碼封裝成一個函數,或者將工具/輔助類中的靜態方法導入為函數,然后在規則LHS/RHS部分中按名稱使用該函數。

示例

// 導入靜態方法/函數
import static org.example.applicant.MyFunctions.hello;// 函數1
function boolean ageJudge(Integer i){if (i > 10){return true;} else {return false;}
}// 使用函數
rule "age"
enabled true
wheneval(ageJudge(10));
then
end

5.query

查詢在工作內存中相關的事實對象。查詢的名稱對于 KieBase 是全局的,因此對于該項目中的所有其他規則的查詢必須是唯一的。ksession.getQueryResults("name") 獲取查詢結果,其中“name”是查詢名稱。

示例

package drools.drl// 導入輸入類型
import com.ahao.project.input.UserIn;
global com.ahao.project.output.UserOut output;query "age>10"$in:UserIn(age > 10)
end

獲取結果

QueryResults queryResults = kieSession.getQueryResults("age>10");
Iterator<QueryResultsRow> iterator = queryResults.iterator();
while (iterator.hasNext()) {QueryResultsRow next = iterator.next();log.info("查詢結果:{}",next.get("$in"));
}// [main] INFO DroolsTest2 - 查詢結果:UserIn(age=35)
// [main] INFO DroolsTest2 - 查詢結果:UserIn(age=45)

6.declare

聲明類型。用于在DRL聲明一個新的類型。

示例

package drools.drlimport com.ahao.project.input.UserIn// 聲明一個Person類型
declare Personname:Stringage:Integer
endrule "age"
enabled true
when$in:UserIn(age > 10)
thenPerson person = new Person();person.setAge($in.getAge());person.setName("命中規則");System.out.println(person);
end

結果
在這里插入圖片描述

7.global

全局變量。DRL文件中的全局變量通常為規則提供數據或服務,如在then中使用的應用程序服務(service),并從規則返回數據。

示例

// 全局變量的定義
global com.ahao.project.output.UserOut output;
// 可以有多個
// global com.ahao.project.output.UserOut output222;

注意:

執行規則時,需要先設置全局變量對象

kieSession.setGlobal("output", output);
// 然后再 kieSession.fireAllRules()

8.rule

rule語法結構如下圖

rule

8.1.規則屬性

屬性默認值描述
salience0規則優先級。在同一個 activation-group 中,具有較高優先級(值越大)的規則優先執行
示例: salience 10
enabledtrue是否啟用該規則
示例: enabled true
date-effectivenull只有當前日期時間在 date-effective 屬性之時,才能激活該規則
示例: date-effective "4-Sep-2018"
date-expiresnull只有當前日期時間在 date-expires 屬性之時,才能激活該規則
示例: date-expires "4-Oct-2018"
no-loopfalse是否可循環。某些情況下(update函數等),規則可以被再次激活
示例: no-loop true
agenda-groupdefault議程組。對議程進行分區,以提供對規則組的更多執行控制。只有獲得焦點的議程組中的規則才能被激活。
示例: agenda-group "GroupName"
activation-groupnull激活組。一個激活組只能激活一個規則,即使其他規則體的LHS部分仍然為true也不會再被執行。
示例: activation-group "GroupName"
durationnull以毫秒為單位的持續時間。如果規則條件當前滿足,則在該持續時間之后可以激活規則。
示例: duration 10000
timernull調度器。“時間間隔”或“cron”計時器定義
示例: timer ( cron:* 0/15 * * * ? ) (every 15 minutes)
calendarnull用于調度規則的 Quartz calendar
示例: calendars "* * 0-7,18-23 ? * *" (exclude non-business hours)
auto-focusfalse自動獲取焦點,僅適用于議程組內的規則。選擇該選項后,下次激活規則時,會自動將焦點指定給規則所分配的議程組:
示例:auto-focus true
lock-on-activefalse僅適用于規則流組或議程組內的規則。選擇該選項后,下次規則的規則流組變為活動狀態或規則的議程組收到焦點時,在規則流組不再活動或議程組失去焦點之前,無法再次激活規則。是no-loop屬性的更強版本。
示例: lock-on-active true
ruleflow-groupnull規則流組。只有被關聯的規則流激活這個組時,規則才能激活
示例: ruleflow-group "GroupName"
dialectmvel用來定義規則中要使用的語言類型
示例: dialect "java"

8.2.LHS

規則的when部分(也稱為Left Hand Side(LHS))包含執行操作必須滿足的條件。

8.2.1.語法格式

格式

// 格式如下(對象名稱前的 $ 非必需的)
when$對象名稱:事實對象的全限定類名(字段約束)// 如果已經import了事實對象的全限定類名
when$對象名稱:事實對象的類名(字段約束)  

示例

// 示例1
when$p:com.test.Person(age > 10 || name == "jack")// 示例2
import com.test.Person;
whenp:Person(age > 10 || name == "jack")
8.2.2.運算符優先級
操作類型符號Notes
嵌套或(null-safe)屬性訪問., .(), !.不是標準的Java語義
List 或者 Map 訪問[]不是標準的Java語義
約束綁定(類型綁定):不是標準的Java語義
乘積*, /,%
加減+, -
位運算>>, >>>, <<
關系型<, <=, >, >=, instanceof
等于== !=使用equals()!equals()語義,非標準Java samenot same語義
非短路 AND&
非短路異運算^
非短路包含 OR``
邏輯運算 AND&&
邏輯運算 OR`
三元運算符? :
逗號分隔 AND,不是標準的Java語義

運算符==使用null-safe equals()語義,而不是通常的equals語義。例如,Person(firstName=="John") 類似于 java.util。Objects.equals(person.getFirstName(),“John”),并且由于"John"不為null,所以該模式也類似于"John".equals(person.get-FirstName)

以上運算符都基本上類似java中的運算符。接下會介紹一些特殊的運算符。

8.2.3.特殊的運算符
1.matches, not matches

判斷與指定的Java正則表達式匹配或不匹配。

示例

Person( country matches "(USA)?\\S*UK" )
2.contains, not contains

數組或集合字段是否包含指定值。可以使用這些運算符來代替String.contains()和!String.contents()。

示例

// 姓名包含王
Person( name contains "王" )
// 假設一個人有多個手機號,phones:List<String>
// 手機號不包含12345678901
Person( phones not contains "12345678901" )
3.memberOf, not memberOf

是否為數組或集合的成員。

示例

// 手機號不包含12345678901
Person( "12345678901" not memberOf phones)
4.in, notin

指定約束中要匹配的多個可能值(復合值限制)。

示例

// 名稱為 jack 或者 mary
Person( name in ("jack","mary"))
5.soundslike

驗證單詞是否具有與給定值幾乎相同的發音(英語發音)。

示例

// firstName "Jon" or "John":
Person( firstName soundslike "John" )
6.str

驗證字符串字段是以指定值開始,以指定值結束,或者字符串的長度。

示例

// 消息的以"R1"開始
Message( msg str[startsWith] "R1" )// 消息的以"R2"結尾
Message( msg str[endsWith] "R2" )// 消息的長度為17
Message( msg str[length] 17 )
7.from

獲取數據源。

示例

// 從模式綁定(變量)中獲取數據源
rule "rule1"
whenPerson( $personAddress : address )Address( zipcode == "11110" ) from $personAddress
then
end// 從圖形符號中獲取數據源
rule "rule1"
when$p : Person()$a : Address( zipcode == "23920W" ) from $p.address
then
end// 從迭代器中獲取數據源
rule "rule1"
when$order : Order()$item  : OrderItem( value > 100 ) from $order.items
then
end

8.3.RHS

規則的then部分(也稱為 Right Hand Side(RHS))。當滿足規則的when部分時要執行的操作。操作的主要目的是在Drools引擎的工作內存中插入、刪除或修改數據。有效的規則操作是小的、聲明性的和可讀的。如果需要在規則操作中使用命令式或條件式代碼,請將規則劃分為多個更小、更具聲明性的規則。

8.3.1.set

賦值。

示例

$person.setName("jack");
8.3.2.modify

針對某個事實進行修改,并將更改通知Drools引擎。

語法

modify ( <fact-expression> ) {<expression>,<expression>,...
}

示例

modify( Person ) {setAge( 100 ),setName ( "nick" )
}
8.3.3.update

指定要更新的字段和整個相關事實,并將更改通知Drools引擎。

語法

update ( <object, <handle> )
update ( <object> ) 

示例

person.setAge( 100 );
update( person );
8.3.4.insert

將一個新的事實插入Drools引擎的工作內存中。

語法

insert( new <object> );

示例

insert( new Person() );
8.3.5.delete

從Drools引擎中刪除對象。

語法

delete( <object> );

示例

delete( person );
8.3.6.drools.halt()

終止規則執行。

示例

rule "end_rule"
enabled true
when
thendrools.halt();
end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42693.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Powershell 獲取電腦保存的所有wifi密碼

一. 知識點 netsh wlan show profiles 用于顯示計算機上已保存的無線網絡配置文件 Measure-Object 用于統計數量 [PSCustomObject]{ } 用于創建Powershell對象 [math]::Round 四舍五入 Write-Progress 顯示進度條 二. 代碼 只能獲取中文Windows操作系統的wifi密碼如果想獲取…

護網在即,助力安服仔漏洞掃描~

整合了個漏掃系統&#xff0c;安服仔必備~ 使用場景 網前布防&#xff0c;漏洞掃描&#xff0c;資產梳理 使用方法&#xff1a; 啟動虛擬機后運行命令&#xff1a; ./StartSystemScript.sh 輸入密碼attack 啟動完成后瀏覽器打開網站&#xff1a; http://IP:5000 相關賬戶…

Git 常用命令備忘

1、刪除 (1)、git push origin --delete dev 刪除遠程分支 (2)、git branch -d dev 刪除本地分支 git branch -D dev 強制刪除本地分支 2、創建分支 (1)、git checkout -b dev 創建本地分支 (2)、git push origin dev 創建遠程分支&#xff0c;此時本地分支與遠程…

02-android studio實現下拉列表+單選框+年月日功能

一、下拉列表功能 1.效果圖 2.實現過程 1&#xff09;添加組件 <LinearLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginLeft"20dp"android:layout_marginRight"20dp"android…

表單驗證的藝術:WebKit 支持 HTML 表單的全面解析

表單驗證的藝術&#xff1a;WebKit 支持 HTML 表單的全面解析 在 Web 開發的多彩世界中&#xff0c;表單是用戶與網頁交互的重要橋梁。WebKit 作為眾多現代瀏覽器的渲染引擎&#xff0c;提供了強大的 HTML 表單支持和驗證功能。本文將深入探討 WebKit 如何支持 HTML 表單和進行…

力扣225題解析:使用隊列實現棧的三種解法(Java實現)

引言 在算法和數據結構中&#xff0c;如何用隊列實現棧是一個常見的面試題和實際應用問題。本文將探討力扣上的第225題&#xff0c;通過不同的方法來實現這一功能&#xff0c;并分析各種方法的優劣和適用場景。 問題介紹 力扣225題目要求我們使用隊列實現棧的下列操作&#…

【CMake】基本概念和快速入門

#1. install 是什么 在CMake或項目構建中&#xff0c;install步驟通常指的是將生成的可執行文件、庫文件、頭文件和其他資源復制到指定的安裝目錄&#xff0c;以便進行發布、部署或在其他項目中使用。這個過程通常包括以下內容&#xff1a; 1. 安裝目標 安裝目標是指需要安裝…

運維系列.Nginx中使用HTTP壓縮功能

運維專題 Nginx中使用HTTP壓縮功能 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

【刷題匯總--字符串中找出連續最長的數字串、島嶼數量、拼三角】

C日常刷題積累 今日刷題匯總 - day0071、字符串中找出連續最長的數字串1.1、題目1.2、思路1.3、程序實現 -- 比較1.4、程序實現 -- 雙指針 2、島嶼數量2.1、題目2.2、思路2.3、程序實現 - dfs 3、拼三角3.1、題目3.2、思路3.3、程序實現 -- 蠻力法3.4、程序實現 -- 巧解(單調性…

pwm 呼吸燈(如果燈一直亮或者一直滅)

&#xff08;這個文章收藏在我的csdn keil文件夾下面&#xff09; 如果這樣設置預分頻和計數周期&#xff0c;那么算出來的pwm頻率如下 人眼看起來就只能是一直亮或者滅&#xff0c;因為pwm的頻率太高了&#xff0c;但是必須是頻率夠高&#xff0c;才能實現呼吸燈的緩慢亮緩慢…

SPL-404:如何徹底改變Solana上的NFT與DeFi

在不斷發展的數字資產領域中&#xff0c;非同質化Token&#xff08;NFT&#xff09;已成為一股革命性力量&#xff0c;徹底改變了我們對數字所有權的看法和互動方式。從藝術和收藏品到游戲和虛擬房地產&#xff0c;NFT吸引了創作者、投資者和愛好者的想象力。 本指南將帶您進入…

MySQL數據庫文件在Linux下存放位置

數據庫文件默認在&#xff1a;cd /usr/share/mysql 配置文件默認在&#xff1a;/etc/my.cnf 數據庫目錄&#xff1a;/var/lib/mysql/ 配置文件&#xff1a;/usr/share/mysql(mysql.server命令及配置文件) 相關命令&#xff1a;/usr/bin(mysqladmin、mysqldump等命令)(*mysql的一…

MyBatisPlus-分頁插件的基本使用

目錄 配置插件 使用分頁API 配置插件 首先&#xff0c;要在配置類中注冊MyBatisPlus的核心插件&#xff0c;同時添加分頁插件。&#xff08;可以放到config軟件包下&#xff09; 可以看到&#xff0c;我們定義了一個配置類&#xff0c;在配置類里聲明了一個Bean,這個Bean的名…

排序 -- 計數排序以及對排序的總結

到了這篇文章就說明常見的排序我們就快要講完了&#xff0c;那這篇文章我們就講一下非比較排序--計數排序。 一、非比較排序 1.基本思想 計數排序又稱為鴿巢原理&#xff0c;是對哈希直接定址法的變形應用。 操作步驟&#xff1a; 統計相同元素出現次數 根據統計的結果將序列…

昇思25天學習打卡營第14天|基于MindNLP的文本解碼原理

基于MindNLP的文本解碼原理 文本解碼 文本解碼是自然語言處理中的一個關鍵步驟,特別是在任務如機器翻譯、文本摘要、自動回復生成等領域。解碼過程涉及將編碼器(如語言模型、翻譯模型等)的輸出轉換為可讀的文本序列。以下是一些常見的文本解碼方法和原理: 1. 自回歸解碼:…

打造屬于你的私人云盤:在 OrangePi AIpro 上搭建個人云盤

隨著數字化時代的到來&#xff0c;數據的存儲和管理變得愈發重要。相比于公共云存儲服務&#xff0c;搭建一個屬于自己的個人云盤不僅能夠更好地保護隱私&#xff0c;還可以更靈活地管理數據。 近期剛好收到了一個 香橙派 AIpro 的開發板&#xff0c;借此機會用來搭建一個屬于…

美股交易相關知識點 持續完善中

美股交易時間 美東時間&#xff1a;除了凌晨 03:50 ~ 04:00 這10分鐘時間不可交易以外&#xff0c;其他時間都是可以交易的。 如果是在香港或者北京時間下交易要區分兩種: 美東夏令時&#xff1a;除了下午 15:50 ~ 16:00 這10分鐘時間不可交易以外&#xff0c;其他時間都是可…

法國工程師IMT聯盟 密碼學及其應用 2022年期末考試

1 密碼學 1.1 問題1 對稱加密&#xff08;密鑰加密) 1.1.1 問題 對稱密鑰la cryptographie symtrique和公開密鑰有哪些優缺點&#xff1f; 1.1.1.1 對稱加密&#xff08;密鑰加密)的優缺點 1.1.1.1.1 優點 加解密速度快encrypt and decrypt&#xff1a;對稱加密算法通常基于…

【vue組件庫搭建06】組件庫構建及npm發包

一、格式化目錄結構 根據以下圖片搭建組件庫目錄 index.js作為入口文件&#xff0c;將所有組件引入&#xff0c;并注冊組件名稱 import { EButton } from "./Button"; export * from "./Button"; import { ECard } from "./Card"; export * fr…

一、MyBatis

一、MyBatis 1、MyBatis簡介 1.1、MyBatis歷史 MyBatis最初是Apache的一個開源項目iBatis, 2010年6月這個項目由Apache Software Foundation遷移到了Google Code。隨著開發團隊轉投Google Code旗下&#xff0c; iBatis3.x正式更名為MyBatis。代碼于2013年11月遷移到Github。…