基于Java的開源的規(guī)則引擎框架有很多,從實(shí)現(xiàn)原理上來說分為以下三類:
- 通過Java語言+RETE算法實(shí)現(xiàn)(drools和urule)
- 通過腳本語言+jvm實(shí)現(xiàn)(groovy)
- 通過Java表達(dá)式+jvm實(shí)現(xiàn)(Aviator)
Drools規(guī)則引擎
基本定義
從“頻繁且通用”的業(yè)務(wù)變化中抽象出來的中間服務(wù)層,實(shí)現(xiàn)了將決策邏輯從應(yīng)用代碼中分離出來,并使用預(yù)定義的高級(jí)語法或者可視化的工具編寫業(yè)務(wù)規(guī)則并自動(dòng)優(yōu)化執(zhí)行。
規(guī)則引擎具體執(zhí)行可以分為接受數(shù)據(jù)輸入,高效解釋業(yè)務(wù)規(guī)則,根據(jù)業(yè)務(wù)規(guī)則輸出決策結(jié)果幾個(gè)過程。如下圖所示:
介紹
Drools規(guī)則引擎是一種基于規(guī)則的方法,用于在Drools軟件中實(shí)現(xiàn)專家系統(tǒng)。規(guī)則引擎提供了專家系統(tǒng),這是一種基于知識(shí)的系統(tǒng),可以幫助你做出決策,比如做什么和怎么做。它將知識(shí)收集到一個(gè)知識(shí)庫中,可以用于推理。
Drools規(guī)則引擎基于以下抽象組件實(shí)現(xiàn):
- 規(guī)則(Rules):業(yè)務(wù)規(guī)則或DMN決策。所有規(guī)則必須至少包含觸發(fā)該規(guī)則的條件以及對(duì)應(yīng)的操作。
- 事實(shí)(Facts):輸入到規(guī)則引擎的數(shù)據(jù),用于規(guī)則的條件的匹配。
- 生產(chǎn)內(nèi)存(Production memory):規(guī)則引擎中規(guī)則存儲(chǔ)的地方
- 工作內(nèi)存(Working memory):規(guī)則引擎中Fact對(duì)象存儲(chǔ)的地方。
- 議程(Agenda):用于存儲(chǔ)被激活的規(guī)則的分類和排序的地方。
Drools規(guī)則引擎的核心組件有:
? KieFileSystem:一個(gè)內(nèi)存文件系統(tǒng),用于存儲(chǔ)規(guī)則文件和其他資源。
? KieContainer:一個(gè)包含多個(gè)KieBases的容器,每個(gè)KieBase代表一個(gè)知識(shí)庫。
? KieSession:一個(gè)用于插入事實(shí)和觸發(fā)規(guī)則的會(huì)話。
? Rule:一個(gè)表示單個(gè)規(guī)則的對(duì)象,它包含匹配事實(shí)的條件和執(zhí)行動(dòng)作的結(jié)果。
? Fact:一個(gè)表示輸入數(shù)據(jù)的對(duì)象,它可以被規(guī)則引擎修改、插入或刪除。
優(yōu)劣
優(yōu)點(diǎn)
- 聲明式編程:規(guī)則引擎允許你說“做什么”,而不是“怎么做”。這樣可以使得表達(dá)復(fù)雜問題的解決方案更容易,并且可以驗(yàn)證解決方案的正確性。規(guī)則比代碼更容易閱讀。
- 業(yè)務(wù)邏輯的集中管理:規(guī)則引擎可以將業(yè)務(wù)邏輯從程序代碼中分離出來,使得業(yè)務(wù)邏輯的維護(hù)和變更更快更便宜。同時(shí),也可以縮小業(yè)務(wù)人員和技術(shù)人員之間的溝通鴻溝,因?yàn)橐?guī)則可以用一種容易理解的格式編寫。
- 規(guī)則的復(fù)用和組合:規(guī)則引擎可以將規(guī)則分為不同的模塊,根據(jù)不同的場景和需求進(jìn)行復(fù)用和組合。這樣可以提高規(guī)則的可擴(kuò)展性和靈活性。
缺點(diǎn)
- 學(xué)習(xí)成本:開發(fā)人員需要學(xué)習(xí)一種新的編程方式,掌握規(guī)則引擎的基本概念和語法。同時(shí),也需要了解規(guī)則引擎的內(nèi)部工作原理,以便優(yōu)化規(guī)則的性能和效率。
- 調(diào)試?yán)щy:規(guī)則引擎的運(yùn)行過程可能涉及到大量的規(guī)則匹配和推理,當(dāng)出現(xiàn)錯(cuò)誤或異常時(shí),很難定位問題的原因和位置。此外,規(guī)則之間也可能存在沖突或循環(huán),需要注意避免或解決。
- 不適合簡單或穩(wěn)定的業(yè)務(wù)邏輯:如果一個(gè)應(yīng)用中只有很少或沒有變化的業(yè)務(wù)邏輯,使用規(guī)則引擎可能是一種過度設(shè)計(jì),會(huì)增加不必要的復(fù)雜度和開銷。在這種情況下,直接使用程序代碼可能更合適。
基本概念
規(guī)則引擎(RE)是一種模塊,可以自動(dòng)化管理一些高度可變的過程?;镜母拍钍菍⑴c過程的對(duì)象與實(shí)現(xiàn)這些過程的邏輯分離。邏輯是通過編寫規(guī)則來定義的。
Drools規(guī)則引擎使用開源的Drools規(guī)則引擎,它使用了一種改進(jìn)的Rete算法,并具有前向和后向鏈推理機(jī)制。
Fact:事實(shí),是指在drools規(guī)則應(yīng)用當(dāng)中,將一個(gè)普通的Java Bean插入到Working Memory后的對(duì)象就是Fact對(duì)象。
規(guī)則引擎構(gòu)成
由以下三部分組成:
- Working Memory(工作內(nèi)存):規(guī)則引擎會(huì)從Working Memory中獲取數(shù)據(jù)并和規(guī)則文件中定義的規(guī)則進(jìn)行模式匹配,應(yīng)用程序需要將數(shù)據(jù)插入到Working Memory中。
- Rule Base(規(guī)則庫):在規(guī)則文件中定義的規(guī)則都會(huì)被加載到規(guī)則庫中。
- Inference Engine(推理引擎)
其中Inference Engine(推理引擎)又包括:
- Patter Matcher(匹配器):將Rule Base中所有規(guī)則與Working Memory中的Fact對(duì)象進(jìn)行模式匹配,匹配成功的規(guī)則將被激活放入Agenda。
- Agenda(議程):用于存放通過匹配器進(jìn)行模式匹配后被激活的規(guī)則。
- Execution Engine(執(zhí)行引擎)
規(guī)則結(jié)構(gòu)
Drools規(guī)則引擎有自己的語法來編寫規(guī)則,這種語法是聲明式、簡潔和明確的。一個(gè)規(guī)則有以下結(jié)構(gòu):
- when 條件
條件是根據(jù)一定的語法規(guī)則來編輯的。根據(jù)這種語法,設(shè)置一個(gè)條件意味著驗(yàn)證一個(gè)事實(shí)。應(yīng)用規(guī)則的上下文由一組事實(shí)組成,這些事實(shí)描述了RE操作的當(dāng)前情況,并被斷言在一個(gè)工作內(nèi)存中。為了判斷是否應(yīng)用一個(gè)規(guī)則,RE驗(yàn)證一個(gè)事實(shí)是否在工作內(nèi)存中被有效地?cái)嘌浴H绻?,那么?guī)則就被應(yīng)用。 - then 動(dòng)作
動(dòng)作區(qū)域是用普通的Java代碼來編輯的,包含了如果條件被驗(yàn)證要執(zhí)行的動(dòng)作。要應(yīng)用的規(guī)則被包含在一個(gè)生產(chǎn)內(nèi)存中。RE比較生產(chǎn)內(nèi)存中假設(shè)的動(dòng)作和工作內(nèi)存中斷言的事實(shí)。如果有兼容性,RE執(zhí)行一個(gè)或多個(gè)規(guī)則。
簡單來說,Drools規(guī)則就是根據(jù)when后的條件來匹配工作內(nèi)存中的事實(shí),如果匹配成功,就執(zhí)行then后的動(dòng)作。
規(guī)則引擎執(zhí)行過程
- 將初始數(shù)據(jù)(fact)輸入至工作內(nèi)存(Working Memory);
- 使用Pattern Matcher將規(guī)則庫中的規(guī)則(rule)和數(shù)據(jù)(fact)比較;
- 如果執(zhí)行規(guī)則存在沖突(confict),即同時(shí)激活了多個(gè)規(guī)則,將沖突的規(guī)則放入沖突集合;
- 解決沖突,將激活的規(guī)則按順序放入Agenda;
- 執(zhí)行Agenda中的規(guī)則。重復(fù)步驟2至5,指導(dǎo)執(zhí)行完畢Agenda中的所有規(guī)則。
規(guī)則存儲(chǔ)
Drools規(guī)則引擎使用一個(gè)知識(shí)庫(Knowledge Base)來存儲(chǔ)規(guī)則,知識(shí)庫是Drools生態(tài)系統(tǒng)中的知識(shí)的代表,它包含了規(guī)則所在的資源的信息,也可以創(chuàng)建知識(shí)會(huì)話。
知識(shí)庫可以分為不同的模塊(Module),每個(gè)模塊可以包含多個(gè)知識(shí)庫,每個(gè)知識(shí)庫可以包含不同的會(huì)話。
規(guī)則可以以.drl文件或Excel表格的形式編寫,也可以通過Java配置或注解來定義。
規(guī)則可以通過KieFileSystem來寫入一個(gè)內(nèi)存文件系統(tǒng),也可以通過ResourceFactory來從類路徑或其他位置讀取。
規(guī)則可以通過KieContainer來管理和加載,KieContainer是一個(gè)包含多個(gè)KieBases的容器,每個(gè)KieBase代表一個(gè)知識(shí)庫。
Kie 介紹
Kie 相關(guān)組件
Drools是Kie中的一個(gè)組件。
知識(shí)庫
知識(shí)庫(Knowledge Base)是一種存儲(chǔ)和組織知識(shí)的方式,它可以包含不同類型和格式的數(shù)據(jù),例如文本、圖像、視頻、音頻等。知識(shí)庫的結(jié)構(gòu)通常取決于知識(shí)的領(lǐng)域、用途和特點(diǎn),但一般來說,它由以下幾種基本數(shù)據(jù)結(jié)構(gòu)組成或者與之相關(guān):
- 實(shí)體(Entity):知識(shí)庫中的基本單元,代表一個(gè)具體或抽象的事物,例如人、地點(diǎn)、事件、概念等。實(shí)體通常有一個(gè)唯一的標(biāo)識(shí)符和一些屬性(Attribute),用來描述實(shí)體的特征,例如姓名、年齡、顏色等。
- 關(guān)系(Relation):知識(shí)庫中描述實(shí)體之間的聯(lián)系的方式,例如父子、屬于、發(fā)生在等。關(guān)系通常有一個(gè)類型和一些約束條件,用來規(guī)定關(guān)系的適用范圍和方向,例如親屬關(guān)系只能在人類實(shí)體之間存在,且是雙向的。
- 三元組(Triple):知識(shí)庫中表示一個(gè)事實(shí)的最小單位,由一個(gè)主體實(shí)體(Subject)、一個(gè)關(guān)系(Predicate)和一個(gè)賓語實(shí)體(Object)組成,例如(北京,首都,中國)、(愛因斯坦,出生于,德國)。三元組可以看作是知識(shí)庫中的語句或斷言,用來表達(dá)知識(shí)的內(nèi)容。
- 本體(Ontology):知識(shí)庫中定義實(shí)體和關(guān)系的類別和層次結(jié)構(gòu)的方式,例如人類是動(dòng)物的子類,父子是親屬關(guān)系的一種。本體可以看作是知識(shí)庫中的語法或規(guī)則,用來約束和指導(dǎo)知識(shí)的表示和推理。
- 圖(Graph):知識(shí)庫中將實(shí)體和關(guān)系視為節(jié)點(diǎn)和邊的網(wǎng)絡(luò)結(jié)構(gòu),例如實(shí)體-關(guān)系圖(ER圖)、語義網(wǎng)(Semantic Web)。圖可以看作是知識(shí)庫中的數(shù)據(jù)模型或視圖,用來存儲(chǔ)和展示知識(shí)的結(jié)構(gòu)和關(guān)聯(lián)。
規(guī)則引擎與知識(shí)庫
對(duì)于一個(gè)規(guī)則引擎來說,它可以看作是一種特殊的知識(shí)庫,它的結(jié)構(gòu)主要由以下幾個(gè)部分組成:
- 規(guī)則(Rule):規(guī)則引擎中的基本單元,代表一個(gè)業(yè)務(wù)邏輯或決策,一般表示為IF-THEN的形式,例如IF(年齡>18)THEN(成年)。規(guī)則通常由條件(Condition)和動(dòng)作(Action)組成,條件用來判斷是否滿足規(guī)則,動(dòng)作用來執(zhí)行規(guī)則的結(jié)果。
- 事實(shí)(Fact):規(guī)則引擎中的輸入數(shù)據(jù),代表一個(gè)具體或抽象的事物,例如人、訂單、事件等。事實(shí)通常有一些屬性(Attribute),用來描述事實(shí)的特征,例如姓名、價(jià)格、狀態(tài)等。
- 模式匹配器(Pattern Matcher):規(guī)則引擎中的核心組件,負(fù)責(zé)將規(guī)則和事實(shí)進(jìn)行比較,找出符合條件的規(guī)則,并將它們放入沖突集合(Conflict Set)中。
- 沖突解決器(Conflict Resolver):規(guī)則引擎中的核心組件,負(fù)責(zé)從沖突集合中選擇一個(gè)或多個(gè)要執(zhí)行的規(guī)則,并將它們放入議程(Agenda)中。
- 執(zhí)行器(Executor):規(guī)則引擎中的核心組件,負(fù)責(zé)從議程中取出要執(zhí)行的規(guī)則,并執(zhí)行它們的動(dòng)作,同時(shí)更新工作內(nèi)存(Working Memory)中的事實(shí)。
知識(shí)庫中的模塊和會(huì)話的含義可能因不同的系統(tǒng)而有所不同,但一般來說,模塊是指知識(shí)庫中的一個(gè)子集,包含了某個(gè)特定領(lǐng)域或主題的相關(guān)知識(shí)。會(huì)話是指用戶與知識(shí)庫之間的一次或多次交互,用于查詢、更新或探索知識(shí)。模塊和會(huì)話的作用是幫助用戶更有效地獲取和利用知識(shí),以及提高知識(shí)庫的可擴(kuò)展性和可維護(hù)性。
Drools 存儲(chǔ)規(guī)則的數(shù)據(jù)結(jié)構(gòu)
- KieBase:一個(gè)知識(shí)庫,它包含了一組編譯后的規(guī)則、流程和類型聲明,以及相關(guān)的配置和環(huán)境信息。KieBase是線程安全的,可以在多個(gè)KieSession中共享。KieSession是一個(gè)運(yùn)行時(shí)的狀態(tài)容器,它包含了工作內(nèi)存、模式匹配器、沖突解決器和執(zhí)行器等組件,用來執(zhí)行規(guī)則和流程。KieSession是從KieBase中創(chuàng)建的,可以有多個(gè)KieSession與同一個(gè)KieBase關(guān)聯(lián)。
- KieModule:一個(gè)包含了多個(gè)KieBase和KieSession的配置信息的容器,可以是一個(gè)jar文件或者一個(gè)文件夾。KieModule可以從本地或者遠(yuǎn)程的Maven倉庫中加載。
- KieFileSystem:一個(gè)虛擬的文件系統(tǒng),用來存儲(chǔ)規(guī)則文件和其他資源文件,可以通過KieBuilder將其編譯為KieModule。
- KieContainer:一個(gè)管理KieModule的容器,可以從本地或者遠(yuǎn)程的Maven倉庫中加載KieModule,并且可以動(dòng)態(tài)地更新KieModule。
- KieSession:一個(gè)運(yùn)行時(shí)的狀態(tài)容器,用來執(zhí)行規(guī)則和流程,可以從KieBase中創(chuàng)建。KieSession有兩種類型:Stateful和Stateless。Stateful KieSession會(huì)保留工作內(nèi)存中的數(shù)據(jù),需要手動(dòng)釋放資源;Stateless KieSession不會(huì)保留工作內(nèi)存中的數(shù)據(jù),每次執(zhí)行完畢后會(huì)自動(dòng)釋放資源。
Rete 算法
Rete 是一種進(jìn)行大量模式集合和大量對(duì)象集合間比較的高效方法,通過網(wǎng)絡(luò)篩選的方法找出所有匹配各個(gè)模式的對(duì)象和規(guī)則。 其核心思想是用分離的匹配項(xiàng)構(gòu)造匹配網(wǎng)絡(luò),同時(shí)緩存中間結(jié)果。以空間換時(shí)間。規(guī)則編譯(rule compilation)和運(yùn)行時(shí)執(zhí)行(runtime execution)。
Rete算法是一種用于實(shí)現(xiàn)規(guī)則引擎的高效模式匹配算法,它可以快速地找出滿足一組規(guī)則的數(shù)據(jù)集合(zhuanlan.zhihu.com)。
原理
- 將規(guī)則的條件部分(LHS)轉(zhuǎn)換為一個(gè)網(wǎng)絡(luò)結(jié)構(gòu),稱為Rete網(wǎng)絡(luò),其中包含了不同類型的節(jié)點(diǎn),如alpha節(jié)點(diǎn)、beta節(jié)點(diǎn)、join節(jié)點(diǎn)和terminal節(jié)點(diǎn)。
- 將數(shù)據(jù)(facts)輸入到Rete網(wǎng)絡(luò)的根節(jié)點(diǎn),沿著網(wǎng)絡(luò)流動(dòng),經(jīng)過不同的節(jié)點(diǎn)進(jìn)行過濾、合并和檢測,最終到達(dá)terminal節(jié)點(diǎn),表示匹配了某個(gè)規(guī)則的結(jié)果部分(RHS)。
- 在每個(gè)節(jié)點(diǎn)中,維護(hù)一個(gè)內(nèi)存區(qū)域,用于存儲(chǔ)通過該節(jié)點(diǎn)的數(shù)據(jù)或數(shù)據(jù)組合,以避免重復(fù)計(jì)算和提高效率。
- 在每次數(shù)據(jù)或規(guī)則發(fā)生變化時(shí),更新Rete網(wǎng)絡(luò)中的內(nèi)存區(qū)域,并重新觸發(fā)匹配過程。
Rete算法的用途是提高規(guī)則引擎的性能和可擴(kuò)展性,使其能夠處理大量的數(shù)據(jù)和規(guī)則,以及動(dòng)態(tài)地適應(yīng)數(shù)據(jù)和規(guī)則的變化。
Drools規(guī)則引擎提供了一系列的API和工具來創(chuàng)建、編譯、加載和執(zhí)行規(guī)則,以及管理Rete網(wǎng)絡(luò)中的數(shù)據(jù)和狀態(tài)。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- Rete算法可以快速地找出滿足一組規(guī)則的數(shù)據(jù)集合,避免了重復(fù)計(jì)算和遍歷,提高了規(guī)則引擎的性能和可擴(kuò)展性(jianshu.com)(blog.csdn.net)。
- Rete算法的匹配速度與規(guī)則數(shù)目無關(guān),只與數(shù)據(jù)的數(shù)量和復(fù)雜度有關(guān)(blog.csdn.net)。
- Rete算法可以動(dòng)態(tài)地適應(yīng)數(shù)據(jù)和規(guī)則的變化,實(shí)現(xiàn)了數(shù)據(jù)驅(qū)動(dòng)的推理過程(jianshu.com)(blog.csdn.net)。
缺點(diǎn)
- Rete算法需要維護(hù)一個(gè)復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)和大量的內(nèi)存空間,消耗了系統(tǒng)的資源(jianshu.com)(blog.csdn.net)。
- Rete算法對(duì)數(shù)據(jù)的刪除和修改操作比較困難,需要執(zhí)行額外的查找和更新(blog.csdn.net)。
- Rete算法對(duì)于一些簡單或者不經(jīng)常變化的規(guī)則,可能沒有必要使用,反而增加了系統(tǒng)的開銷(jianshu.com)(blog.csdn.net)。
舉例
假設(shè)我們有以下三條規(guī)則:
- 如果一個(gè)人的年齡大于18歲,那么他是成年人。
- 如果一個(gè)人的性別是男,那么他是男性。
- 如果一個(gè)人是成年人并且是男性,那么他可以參軍。
我們可以用Rete算法來構(gòu)建一個(gè)網(wǎng)絡(luò)來匹配這些規(guī)則。網(wǎng)絡(luò)的結(jié)構(gòu)如下:https://i.imgur.com/0fZw7Qg.png
網(wǎng)絡(luò)中有以下幾種節(jié)點(diǎn):
- Root node:網(wǎng)絡(luò)的入口,接收所有的數(shù)據(jù)(facts)。
- Object type node:根據(jù)數(shù)據(jù)的類型進(jìn)行過濾,只傳遞符合類型的數(shù)據(jù)到下一層節(jié)點(diǎn)。
- Alpha node:根據(jù)數(shù)據(jù)的屬性進(jìn)行過濾,只傳遞符合條件的數(shù)據(jù)到下一層節(jié)點(diǎn)。
- Beta node:根據(jù)兩個(gè)輸入數(shù)據(jù)的關(guān)系進(jìn)行過濾,只傳遞符合條件的數(shù)據(jù)組合(token)到下一層節(jié)點(diǎn)。
- Terminal node:網(wǎng)絡(luò)的出口,表示匹配了某條規(guī)則的結(jié)果。
每個(gè)節(jié)點(diǎn)都有一個(gè)內(nèi)存區(qū)域,用于存儲(chǔ)通過該節(jié)點(diǎn)的數(shù)據(jù)或數(shù)據(jù)組合。當(dāng)數(shù)據(jù)或規(guī)則發(fā)生變化時(shí),網(wǎng)絡(luò)中的內(nèi)存區(qū)域會(huì)相應(yīng)地更新,并重新觸發(fā)匹配過程。
假設(shè)我們有以下三個(gè)數(shù)據(jù):
- {name: “Tom”, age: 20, gender: “male”}
- {name: “Alice”, age: 17, gender: “female”}
- {name: “Bob”, age: 19, gender: “male”}
當(dāng)這些數(shù)據(jù)輸入到網(wǎng)絡(luò)中時(shí),會(huì)經(jīng)歷以下過程:
- 數(shù)據(jù)從root node進(jìn)入網(wǎng)絡(luò),然后根據(jù)類型被分發(fā)到對(duì)應(yīng)的object type node。因?yàn)檫@里所有的數(shù)據(jù)都是Person類型,所以都會(huì)被傳遞到Person object type node。
- 數(shù)據(jù)從Person object type node進(jìn)入到alpha node,然后根據(jù)屬性被分發(fā)到對(duì)應(yīng)的alpha node。例如,Tom會(huì)被傳遞到age > 18和gender == "male"兩個(gè)alpha node,Alice會(huì)被傳遞到age <= 18和gender == "female"兩個(gè)alpha node,Bob會(huì)被傳遞到age > 18和gender == "male"兩個(gè)alpha node。
- 數(shù)據(jù)從alpha node進(jìn)入到beta node,然后根據(jù)兩個(gè)輸入數(shù)據(jù)的關(guān)系被分發(fā)到對(duì)應(yīng)的beta node。例如,Tom和Bob會(huì)被傳遞到age > 18 && gender == "male"這個(gè)beta node,Alice不會(huì)被傳遞到任何beta node。
- 數(shù)據(jù)從beta node進(jìn)入到terminal node,然后表示匹配了某條規(guī)則的結(jié)果。例如,Tom和Bob會(huì)被傳遞到rule 3這個(gè)terminal node,表示他們可以參軍。Alice不會(huì)被傳遞到任何terminal node。
這就是一個(gè)簡單的Rete算法的例子。你可以看到,Rete算法通過構(gòu)建一個(gè)網(wǎng)絡(luò)來高效地匹配大量的規(guī)則和數(shù)據(jù),并且可以動(dòng)態(tài)地適應(yīng)變化。
前向和后向鏈推理機(jī)制
前向鏈和后向鏈?zhǔn)莾煞N不同的推理機(jī)制,它們在Drools中發(fā)揮著不同的作用。
前向鏈
前向鏈?zhǔn)且环N從已知事實(shí)和規(guī)則出發(fā),推導(dǎo)出新的事實(shí)和結(jié)論的過程。它是一種數(shù)據(jù)驅(qū)動(dòng)的方法,適用于需要處理大量數(shù)據(jù)并觸發(fā)相應(yīng)規(guī)則的場景。前向鏈?zhǔn)荄rools的默認(rèn)推理機(jī)制,它通過構(gòu)建一個(gè)Rete網(wǎng)絡(luò)來高效地匹配規(guī)則和數(shù)據(jù)。
后向鏈
后向鏈?zhǔn)且环N從目標(biāo)或假設(shè)出發(fā),通過回溯一系列事實(shí)和規(guī)則來驗(yàn)證其真?zhèn)蔚倪^程(baeldung.cc)。它是一種目標(biāo)驅(qū)動(dòng)的方法,適用于需要根據(jù)特定目標(biāo)來查詢數(shù)據(jù)的場景(baeldung.cc)。后向鏈?zhǔn)荄rools從5.2.0版本開始支持的推理機(jī)制,它通過定義查詢來實(shí)現(xiàn)后向鏈。
對(duì)比
- 適用場景:前向鏈適用于需要處理大量數(shù)據(jù)并觸發(fā)相應(yīng)規(guī)則的場景,例如欺詐檢測、風(fēng)險(xiǎn)評(píng)估、推薦系統(tǒng)等。后向鏈適用于需要根據(jù)特定目標(biāo)來查詢數(shù)據(jù)的場景,例如診斷系統(tǒng)、智能問答、規(guī)劃系統(tǒng)等。
- 推理效率:前向鏈的推理效率取決于數(shù)據(jù)的數(shù)量和規(guī)則的復(fù)雜度,如果數(shù)據(jù)量很大或規(guī)則很多,可能會(huì)導(dǎo)致推理過程緩慢或占用大量內(nèi)存。后向鏈的推理效率取決于目標(biāo)的難度和規(guī)則的相關(guān)性,如果目標(biāo)很難或規(guī)則很少,可能會(huì)導(dǎo)致推理過程失敗或無法找到答案。
- 推理方式:前向鏈?zhǔn)且环N自下而上的推理方式,它從已知事實(shí)出發(fā),不斷地生成新的事實(shí)和結(jié)論,直到滿足某個(gè)條件或達(dá)到某個(gè)限制。后向鏈?zhǔn)且环N自上而下的推理方式,它從目標(biāo)或假設(shè)出發(fā),不斷地尋找支持或反駁它的事實(shí)和規(guī)則,直到證明其真?zhèn)位驘o法繼續(xù)。
- 推理結(jié)果:前向鏈的推理結(jié)果是一組滿足規(guī)則條件的事實(shí)和結(jié)論,它們可能有多個(gè)或沒有。后向鏈的推理結(jié)果是一個(gè)確定的答案,它是對(duì)目標(biāo)或假設(shè)的真假判斷,它只有一個(gè)或不存在。
總之,前向鏈和后向鏈在Drools中分別提供了不同的推理能力,可以根據(jù)不同的業(yè)務(wù)需求來選擇合適的推理機(jī)制。
應(yīng)用場景
Drools規(guī)則引擎的應(yīng)用場景有:
- 業(yè)務(wù)決策:規(guī)則引擎可以用于處理復(fù)雜的業(yè)務(wù)邏輯,如信用評(píng)分、保險(xiǎn)核保、貸款審批等,根據(jù)不同的事實(shí)和規(guī)則,產(chǎn)生自動(dòng)化的決策(https://www.baeldung.com/drools)。
- 復(fù)雜事件處理:規(guī)則引擎可以用于處理實(shí)時(shí)的事件流,如股票交易、網(wǎng)絡(luò)監(jiān)控、傳感器數(shù)據(jù)等,根據(jù)不同的事件和規(guī)則,觸發(fā)相應(yīng)的動(dòng)作或警報(bào)(https://www.drools.org/)。
- 工作流程:規(guī)則引擎可以用于定義和執(zhí)行業(yè)務(wù)流程,如訂單處理、發(fā)票管理、人事審批等,根據(jù)不同的任務(wù)和規(guī)則,控制流程的走向和狀態(tài)https://www.drools.org/。
- 講解學(xué)習(xí)
概念和特點(diǎn)
Drools是一個(gè)基于Java的開源業(yè)務(wù)規(guī)則管理系統(tǒng)(BRMS),它提供了一個(gè)核心的業(yè)務(wù)規(guī)則引擎(BRE),可以用簡單易懂的規(guī)則語言來描述業(yè)務(wù)邏輯,并將業(yè)務(wù)邏輯和數(shù)據(jù)對(duì)象分離,實(shí)現(xiàn)業(yè)務(wù)邏輯的靈活變更和復(fù)用。
架構(gòu)和組件
Drools規(guī)則引擎由以下幾個(gè)主要組件構(gòu)成:規(guī)則文件(.drl)、知識(shí)庫(KieBase)、會(huì)話(KieSession)、工作內(nèi)存(Working Memory)、議程(Agenda)、推理機(jī)(Inference Engine)和規(guī)則流(Rule Flow)。文章來源:http://www.zghlxwxcb.cn/news/detail-475459.html
使用方法和示例
Drools規(guī)則引擎的使用方法主要包括以下幾個(gè)步驟:文章來源地址http://www.zghlxwxcb.cn/news/detail-475459.html
- 創(chuàng)建規(guī)則文件,定義規(guī)則的名稱、屬性、條件和動(dòng)作;
- 創(chuàng)建知識(shí)庫,加載規(guī)則文件并編譯為字節(jié)碼;
- 創(chuàng)建會(huì)話,從知識(shí)庫中獲取會(huì)話對(duì)象;
- 插入事實(shí),將業(yè)務(wù)數(shù)據(jù)插入到工作內(nèi)存中;
- 執(zhí)行規(guī)則,觸發(fā)推理機(jī)根據(jù)事實(shí)和規(guī)則進(jìn)行匹配和執(zhí)行;
- 處理結(jié)果,獲取規(guī)則執(zhí)行的結(jié)果并進(jìn)行相應(yīng)的處理。
相關(guān)文獻(xiàn)資料
- Putting BPMN and DMN to Work: a Pediatric Surgery Case Study(https://www.drools.org/community/research.html):這篇論文介紹了如何使用Drools Workbench來建模和執(zhí)行兒科手術(shù)的業(yè)務(wù)流程和決策,展示了Drools的實(shí)際應(yīng)用效果。
- Modeling surgical pediatric processes with BPMN and DMN(https://link.springer.com/chapter/10.1007/978-3-030-43306-2_34):這篇論文是上一篇論文的畢業(yè)論文版本,更詳細(xì)地描述了使用Drools Workbench的方法和步驟,以及遇到的挑戰(zhàn)和解決方案。
- Semi-automatic Composition of Geospatial Web Services Using JBoss Rules:這篇論文探討了如何使用Drools來實(shí)現(xiàn)地理空間Web服務(wù)的半自動(dòng)組合,提出了一種基于規(guī)則的服務(wù)匹配和選擇算法,以及一種基于規(guī)則的服務(wù)組合框架。
- Application Research of Business Rules Engine Management System Based on Drools:這篇論文介紹了基于Drools的業(yè)務(wù)規(guī)則引擎管理系統(tǒng)的設(shè)計(jì),包括規(guī)則文件的可視化封裝、業(yè)務(wù)對(duì)象和參數(shù)對(duì)象的抽象配置、規(guī)則生命周期的管理等。
- Drools rules engine(https://www.ibm.com/docs/en/sig-and-i/5.2.5?topic=engine-drools-rules):這篇文檔介紹了Drools規(guī)則引擎的基本概念和架構(gòu),包括事實(shí)、工作內(nèi)存、規(guī)則、知識(shí)庫、知識(shí)會(huì)話等,以及如何使用Java配置和注解來創(chuàng)建和執(zhí)行規(guī)則。
- Introduction to Drools(https://www.baeldung.com/drools):這篇文章也介紹了Drools規(guī)則引擎的基本概念和架構(gòu),以及如何使用Maven依賴和Spring Boot來創(chuàng)建和執(zhí)行規(guī)則。
到了這里,關(guān)于Drools 規(guī)則引擎原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!