【正文】
n Smith, 16 )。 ( applicant )。 上面的代碼依據(jù)規(guī)則執(zhí)行數(shù)據(jù)。 迄今,我們只使用了單實(shí)例,但是如果我們希望使用多個(gè)呢?我們可以根據(jù)任何 實(shí)現(xiàn)了可迭代的對(duì)象執(zhí)行,比如,一個(gè)集合。 public class Applicant { private String name。 // getter and setter methods here } public class Application { private Date dateApplied。 // getter and setter methods here } 我們也可以增加另一條規(guī)則,用于驗(yàn)證申請(qǐng)是在某一段時(shí)間產(chǎn)生的。 end rule Application was made this year when $a : Application( dateApplied 01jan2020 ) then $( false )。下面顯示的代碼,根據(jù)一個(gè)可迭代的 list 執(zhí)行,集合的所有元素在任何匹配的規(guī)則被引發(fā)之前被插入。 Applicant applicant = new Applicant( Mr John Smith, 16 )。 assertTrue( application() )。 assertFalse( application() )。 CommandFactory常用來創(chuàng)建命令,所以下面的代碼等價(jià)于 execute(Iterable it)。 當(dāng)使用多個(gè)命令和利用輸出標(biāo)識(shí)符獲取結(jié)果時(shí),批處理執(zhí)行和命令工廠特別有用。 ( ( new Person( Mr John Smith ), mrSmith )。 BatchExecutionResults results = ( ( cmds ) )。 CommandFactory 可以支持許多被用于 BatchExecut 中的其他命令,如 StartProcess,Query, 主 SetGlobal。下面是有狀態(tài)會(huì)話的通用用例,但不只限于此: ??監(jiān)測(cè) ??用于半自動(dòng)買盤的股市監(jiān)測(cè)與分析。象StatelessKnowledgeSessi on 一樣, StatefulKnowledgeSession 也支持 BatchExecutor 接口,唯一的區(qū)別是 FireAllRules 命令不會(huì)自動(dòng)在一個(gè)狀態(tài)會(huì)話結(jié)束時(shí)調(diào)用。只使用了四個(gè)類,我們表示在一個(gè)房子中的房間,每個(gè)房間有一個(gè)噴頭。 public class Room { private String name // getter and setter methods here } public classs Sprinkler { private Room room。 // getter and setter methods here } public class Fire { private Room room。那個(gè)例子假設(shè)僅有每個(gè)對(duì)象類型的單個(gè)實(shí)例 已被插入,因此只使用了字面約束。最好使用一個(gè)綁定變量作為在一個(gè)模式中的約束。 當(dāng)發(fā)生一個(gè)火災(zāi)時(shí), Fire 類的一個(gè)實(shí)例被創(chuàng)建,并被插入到一個(gè)會(huì)話中。當(dāng)規(guī)則引發(fā)時(shí),結(jié)論被執(zhí)行,噴頭被打開。 ( Turn on the sprinkler for room + $() )。它可以包含一系列逗號(hào)分開的 Java 表達(dá)式,即,通過 modify 語句的控制表達(dá)式調(diào)用選擇的對(duì)象的 setters。這個(gè)過程被稱為推理,它本質(zhì)上是一個(gè)有狀態(tài)會(huì)話的工作方式。通過使用 sequential 模式,也可以顯式關(guān)閉推理。先前的約束根據(jù)命題邏輯已被判決,在那兒引擎約束個(gè)體實(shí)例。當(dāng)某物不存在時(shí),模式根據(jù)關(guān)鍵字 not 匹配。 rule When the fire is gone turn off the sprinkler when $room : Room( ) $sprinkler : Sprinkler( room == $room, on == true ) not Fire( room == $room ) then modify( $sprinkler ) { setOn( false ) }。 end 盡管每個(gè)房間都有噴頭,但只綁定了單個(gè)報(bào)警。先前的引入的 not 用于匹配沒有對(duì)象出現(xiàn) ;現(xiàn)在我們使用它的補(bǔ) exists,其匹配某類別的一個(gè)或多個(gè)實(shí)例。 ( Raise the alarm )。 rule Cancel the alarm when all the fires have gone when not Fire() $alarm : Alarm() then retract( $alarm )。 end 最后,當(dāng)應(yīng)用程序第一次啟動(dòng),以及報(bào)警被消除后,所有噴頭被關(guān)閉時(shí),發(fā)送一條普遍的健康狀況信息。 end 上面的規(guī)則應(yīng)該被放在單獨(dú)的 DRL 文件中,并且使用 的文件名保存到在類路徑的某個(gè)目錄中,象在無狀態(tài)會(huì)話例子中的一樣。區(qū)別是,這次我們根據(jù)知識(shí)庫創(chuàng)建了一個(gè)有狀態(tài)會(huì)話,而以前我們創(chuàng)建了一個(gè)無狀態(tài)會(huì)話。 ( ( , getClass() ), )。 } ( () )。 利用創(chuàng)建的這個(gè)會(huì)話,現(xiàn)在可以隨著時(shí)間推移反復(fù)使用它。此時(shí),引擎做了所有的匹配,但還沒有規(guī)則引發(fā)。 String[] names = new String[]{kitchen, bedroom, office, livingroom}。 for( String name: names ){ Room room = new Room( name )。 ( room )。 ( sprinkler )。 Fact Handle 是一個(gè)被插入對(duì)象的內(nèi)部引擎引用,并且允許在稍后的時(shí)間點(diǎn)撤銷或修改實(shí)例。 Fire kitchenFire = new Fire( ( kitchen ) )。 FactHandle kitchenFireHandle = ( kitchenFire )。 ()。這導(dǎo)致噴頭被關(guān)閉,報(bào)警被取消,并且最后健康信息再次顯示。 ( officeFireHandle )。 Turn on the sprinkler for room office Turn on the sprinkler for room kitchen Cancel the alarm Everything is ok