已閱讀5頁,還剩72頁未讀, 繼續(xù)免費閱讀
基于Java規(guī)則引擎的動態(tài)數(shù)據(jù)清洗研究與設計.pdf 免費下載
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
武漢理工大學碩士學位論文基于Java規(guī)則引擎的動態(tài)數(shù)據(jù)清洗研究與設計姓名:曹永亮申請學位級別:碩士專業(yè):計算機應用技術(shù)指導教師:王舜燕20080501摘要在運營管理過程中,企業(yè)積累了大量的、極為重要的電子數(shù)據(jù)。業(yè)務決策者在進行分析決策時對這些數(shù)據(jù)的依賴性日益增強,錯誤或沖突的數(shù)據(jù)很可能會導致錯誤的決策,從而給企業(yè)造成巨大的損失。因此在這些數(shù)據(jù)進入決策系統(tǒng)之前需要對其進行處理,以提高決策系統(tǒng)的可信度和可用性。為解決上述問題,業(yè)界提出了數(shù)據(jù)清洗的解決方案,即從大量原始數(shù)據(jù)中按一定規(guī)則(領(lǐng)域知識規(guī)則)檢測出“臟數(shù)據(jù)并按一定的規(guī)則(清洗動作規(guī)則)修復或丟棄之。傳統(tǒng)的數(shù)據(jù)清洗工具存在以下不足:“臟數(shù)據(jù)的檢測和修復邏輯被嵌入到復用性差的硬編碼中或依賴于靈活但低效的手工判斷。當“臟數(shù)據(jù)的定義發(fā)生變化時需要修改源代碼并重新編譯生成清洗軟件,這在實際使用中是低效的。Java規(guī)則引擎的出現(xiàn),為基于動態(tài)、可配置規(guī)則的數(shù)據(jù)清洗方式提供了可行的技術(shù)基礎(chǔ)。本文介紹了規(guī)則引擎的基本原理,分析了Java規(guī)則引擎的工作機制及其核心算法一Rete算法,并對一種開源的Java規(guī)則引擎軟件包-Drools的API使用方法及其規(guī)則配置文件的結(jié)構(gòu)及含義做了系統(tǒng)地研究分析。本文著重闡述了一種基于Drools規(guī)則引擎的動態(tài)數(shù)據(jù)清洗系統(tǒng)的設計方案。給出了領(lǐng)域知識規(guī)則和清洗動作規(guī)則的巴科斯范式定義,為規(guī)則的持久化存儲提供了基礎(chǔ)。本文設計并實現(xiàn)了使用Drools規(guī)則引擎描述并執(zhí)行清洗邏輯,能處理多種數(shù)據(jù)質(zhì)量問題的動態(tài)數(shù)據(jù)清洗系統(tǒng),彌補了現(xiàn)有數(shù)據(jù)清洗工具的不足。這種動態(tài)性主要體現(xiàn)在規(guī)則的持久化存儲和Drools規(guī)則配置文件的動態(tài)更新。文中還詳細介紹了系統(tǒng)的規(guī)則數(shù)據(jù)庫設計、功能模塊劃分、架構(gòu)和工作流程,給出了主要模塊的部分代碼,并對系統(tǒng)做出了實驗性能分析。關(guān)鍵詞:規(guī)則引擎,動態(tài)數(shù)據(jù)清洗,Drools,數(shù)據(jù)轉(zhuǎn)換AbstractIn course of operation management,companies have accumulated a mass of vitalelectronic dataDecision-makers become increasingly dependent on theabovementioned data while carrying through analysis and strategies弱wrong orconflicting data will likely result in unsuccessful maneuver,which in return can breeddisastrous lossHence it is essential that data should be processed before entering int0decisionmaking system in view of improving its credibility and availabilityTo ravel out the above-mentioned problem,experts have put forward a solutioncalled data cleansing which refers to inspecting”dirty data”from massive dataaccording to certain rule(domanial knowledge)and to repairing or discarding it in thelight of some rule(cleansing action rule)Traditional tools for data cleansing have the following insufficiency:it isinefficient in practice in that modification and recompilation arc required for thegeneration of cleansing software,the reason of which is that logic for inspecting andrepairing”dirty data”is embedded into code or relies on agile but inefficient manualjudgmentIt is no other than the appearance of Java Rule Engine that provide feasibletechnological foundation for people to find such a data cleansing mode that based ondynamic and configurable rulesThe thesis presented the basic principles of Rule Engine and investigated theworking mechanism of Java Rule Engine and its core algorithmmRete algorithmThethesis also introduced a kind of open-source Java Rule Engine softwarepackagemDrools and systematically investigated its API usage,the structure andmeanings of its rule configuration fileThe thesis mainly elaborated on the design scheme of dynamic data cleansingsystem based on Drools rule engine and investigated the BNF(BackusNaur Form)definition of domanial knowledge and cleansing rules laying a solid foundation forthe persistence of rulesThe thesis presented the design and implementation of a kind of dynamiccleansing system,which adopts Drools Rule Engine to describe and execute cleansingIlJo毋c卸d c柚deal with many kinds of problems related to data qualityThis svstemreIned踟e the defect that existing data cleansing tools haveThe mainreasons forachleVmg thls al e persistent storage of cleansing rules and dynamic update of Dr001smle configuration fileThe thesis detailedly presented rule databasedesigndivisiDnof functlonal module,architecture,working flow of thesystem,some code segIllentsof main modulesThe thesis also presented the result ofexperimental perfb肋anccsanalysisKey Words:Rule Engine,Dynamic Data Cleansing,Drools,Data TIansfo咖ationIII獨創(chuàng)性聲明本人聲明,所呈交的論文是本人在導師指導下進行的研究工作及取得的研究成果。盡我所知,除了文中特別加以標注和致謝的地方外,論文中不包含其他人已經(jīng)發(fā)表或撰寫過的研究成果,也不包含為獲得武漢理工大學或其它教育機構(gòu)的學位或證書而使用過的材料。與我一同工作的同志對本研究所做的任何貢獻均已在論文中作了明確的說明并表示了謝意。關(guān)于論文使用授權(quán)的說明本人完全了解武漢理工大學有關(guān)保留、使用學位論文的規(guī)定,即學校有權(quán)保留、送交論文的復印件,允許論文被查閱和借閱;學校可以公布論文的全部或部分內(nèi)容,可以采用影印、縮印或其他復制手段保存論文。(保密的論文在解密后應遵守此規(guī)定)簽名:妞翩簽缸壟:迦墨:羔:f2武漢理一r大學碩士論文11業(yè)務規(guī)則的含義第1章緒論業(yè)務規(guī)貝,lJ(Business Rule)是對業(yè)務定義和約束的描述,用于維持業(yè)務結(jié)構(gòu)或控制和影響業(yè)務的行為【1I。業(yè)務規(guī)則技術(shù)的基本思想是將系統(tǒng)處理的業(yè)務邏輯從程序代碼中抽取出來,將其轉(zhuǎn)變?yōu)楹唵蔚臉I(yè)務規(guī)則,以結(jié)構(gòu)化的業(yè)務規(guī)則數(shù)據(jù)來表示業(yè)務行為,采用類自然語言來描述,并集中存儲在規(guī)則庫(以數(shù)據(jù)庫或結(jié)構(gòu)化的形式)中。業(yè)務規(guī)則由業(yè)務人員創(chuàng)建、實時更新和調(diào)試,業(yè)務規(guī)則之間的復雜邏輯關(guān)系由規(guī)則引擎處理【2I。業(yè)務規(guī)則技術(shù)改變了傳統(tǒng)的、以過程形式處理業(yè)務邏輯的方式。業(yè)務規(guī)則具有以下特性【3l:1)原子性,每條業(yè)務規(guī)則不可再分,且只定義一種判斷和操作,復雜的業(yè)務邏輯由多條規(guī)則協(xié)同處理。 。2)獨立性,業(yè)務規(guī)則彼此之間獨立,復雜的邏輯關(guān)系由規(guī)則引擎來處理。業(yè)務規(guī)則存儲在規(guī)則庫中,獨立于數(shù)據(jù)和程序。3)簡單性,業(yè)務規(guī)則用簡單直接的類自然語言來描述,很容易被業(yè)務人員和技術(shù)人員所理解。4)動態(tài)性,業(yè)務人員可以實時地修改業(yè)務規(guī)則,快捷地更新系統(tǒng),低成本地維護系統(tǒng)。5)邏輯性,業(yè)務規(guī)則至少包含條件和執(zhí)行兩個部分,條件是對業(yè)務數(shù)據(jù)作用的判定,執(zhí)行是對業(yè)務數(shù)據(jù)的處理。12規(guī)則引擎的發(fā)展和研究現(xiàn)狀運營管理者對企業(yè)級IT系統(tǒng)的開發(fā)有如下的要求:盡管現(xiàn)代業(yè)務規(guī)則異常復雜,但為提高效率,管理流程必須自動化;市場要求業(yè)務規(guī)則經(jīng)常變化,11r系統(tǒng)必須依據(jù)業(yè)務規(guī)則的變化快速、低成本的更新;為了快速、低成本的更新,業(yè)務人員應能直接管理IT系統(tǒng)中的規(guī)則,而不需要程序開發(fā)人員的參與。這種情況下,項目開發(fā)人員就會碰到以下問題:有些復雜的商業(yè)規(guī)則很難推導出算武漢理工大學碩+論文法和抽象出數(shù)據(jù)模型;軟件工程要求從需求一設計一編碼,然而業(yè)務規(guī)則常常在需求階段可能還沒有明確,在設計和編碼后還在變化,業(yè)務規(guī)則往往嵌在系統(tǒng)各處代碼中;對程序員來說,系統(tǒng)維護、更新困難,更不可能讓業(yè)務人員來管理【4I。隨著商業(yè)以及市場的迅猛發(fā)展,業(yè)務邏輯的變化頻率已經(jīng)從以前的平均18個月縮短到平均6個月甚至更短,這意味著企業(yè)級應用的更新和升級變得越來越頻繁。同時又由于業(yè)務邏輯層沒有標準的框架和統(tǒng)一的開發(fā)方式,使系統(tǒng)升級變的既昂貴又麻煩。因此,迫切需要一個框架或統(tǒng)一的方法來開發(fā)業(yè)務邏輯層。規(guī)則引擎的出現(xiàn)為開發(fā)人員解決上述問題提供了契機。規(guī)則引擎是推理引擎的一種,起源于基于規(guī)則的專家系統(tǒng)(詳見211)。規(guī)則引擎能夠?qū)I(yè)務邏輯從應用程序代碼中分離出來,接受數(shù)據(jù)輸入,解釋業(yè)務規(guī)則,并根據(jù)規(guī)則做出業(yè)務決策。規(guī)則引擎的核心內(nèi)容是其所采用的匹配算法,早期的匹配算法主要是索引計數(shù)匹配法。這種方法的匹配效率并不高,應用并不廣泛。在索引計數(shù)匹配算法的基礎(chǔ)上,F(xiàn)orge于1979年提出了Rete算法。Rete算法犧牲了一部分空間來提高算法的時間效率,使該算法有了廣泛的應用空間。目前,幾乎所有成熟的規(guī)則引擎框架的實現(xiàn)都是基于該算法的。但是,基于這些框架的企業(yè)級應用卻并不多,原因是這些框架都有自己的實現(xiàn)方式,有自己的規(guī)則定義語言。并且,絕大多數(shù)規(guī)則引擎框架都是商業(yè)產(chǎn)品,價格非常昂貴。這種情況直到JSR94t51(Java規(guī)范要求,Java Specification Request)規(guī)則引擎標準和開源規(guī)則引擎的出現(xiàn)才逐漸好轉(zhuǎn)。目前,滿足JSR94標準并且比較成熟的規(guī)則引擎框架主要有JRules、JESS和Drools等。其中,JRules是ILog公司的一個商業(yè)產(chǎn)品,價格很高;JESS是由美國Sandia國家實驗室分布式系統(tǒng)計算組成員Ernest JFriedman Hill在1995年以應用廣泛的CLIPS專家系統(tǒng)外殼為基礎(chǔ)開發(fā)出來的,所采用的規(guī)則描述語言是類CLIPS描述語言,比較難懂,而且也是一個商業(yè)產(chǎn)品;Drools是一個開源并且免費的框架,采用XML或Drl格式的規(guī)則描述語言描述業(yè)務邏輯,是最近才逐漸成熟起來的一個框架,還需要進一步的完善161。本文就是采用Drools規(guī)則引擎來描述并執(zhí)行數(shù)據(jù)清洗邏輯。2武漢理工大學碩士論文13數(shù)據(jù)清洗的應用背景在構(gòu)建業(yè)務數(shù)據(jù)庫時,用戶的錄入錯誤、企業(yè)環(huán)境隨時間推移的改變,都會影響所存放數(shù)據(jù)的質(zhì)量。數(shù)據(jù)質(zhì)量問題可以分成:單數(shù)據(jù)源中的數(shù)據(jù)質(zhì)量問題和多數(shù)據(jù)源中的數(shù)據(jù)質(zhì)量問題。單數(shù)據(jù)源和多數(shù)據(jù)源中的數(shù)據(jù)質(zhì)量問題都還可以分成模式層和實例層的數(shù)據(jù)質(zhì)量問題【似,91。單數(shù)據(jù)源中的數(shù)據(jù)質(zhì)量問題的實質(zhì)是違背了約束(參照性約束,完整性約束及用戶自定義約束),可以分為有不符合模式約束和記錄約束兩種,分別對應于記錄質(zhì)量問題和記錄集質(zhì)量問題。記錄質(zhì)量問題主要有:字段值缺失、字段值不在值域范圍內(nèi)、單字段中包含多個字段值、字段值不符合業(yè)務規(guī)則約束、引用字段值缺失或錯誤??梢栽跀?shù)據(jù)轉(zhuǎn)換中發(fā)現(xiàn)和處理記錄質(zhì)量問題。記錄集質(zhì)量問題主要有:記錄集中存在相似重復記錄和記錄集之間關(guān)聯(lián)不符合關(guān)聯(lián)約束條件。記錄集質(zhì)量問題無法在轉(zhuǎn)換過程中發(fā)現(xiàn),需要在轉(zhuǎn)換之前進行特殊的處理。多數(shù)據(jù)源中的質(zhì)量問題主要有:模式結(jié)構(gòu)不一致、命名不一致,編碼格式不一致,多數(shù)據(jù)源中存在冗余重疊記錄。多數(shù)據(jù)源中的質(zhì)量問題是數(shù)據(jù)轉(zhuǎn)換主要解決的問題,而不是數(shù)據(jù)清洗的目標。數(shù)據(jù)清洗指的是在大量原始數(shù)據(jù)中使用一系列的邏輯規(guī)則和領(lǐng)域知識檢測出“臟數(shù)據(jù)并修復或丟棄之。數(shù)據(jù)清洗一般是作為數(shù)據(jù)抽取、轉(zhuǎn)換和加載(ETLExtractionTransformationLoading)工具的一個功能來實現(xiàn)。也存在大量數(shù)據(jù)清洗專用工具,它們被稱為數(shù)據(jù)質(zhì)量工具。14數(shù)據(jù)清洗的研究現(xiàn)狀數(shù)據(jù)清洗的相關(guān)研究最早可追溯到1959年【塒。從那時起,匯總來自不同數(shù)據(jù)源的數(shù)據(jù)一直被認為是一個重要而困難的問題。近年來,隨著信息化的進展,人們開始系統(tǒng)地研究數(shù)據(jù)清洗問題。主要成果可分類如下:1)特殊領(lǐng)域的數(shù)據(jù)清洗特殊域清洗工具主要解決某些特定領(lǐng)域的數(shù)據(jù)清洗問題,例如姓名和地址數(shù)據(jù)151。這是目前研究得較多的領(lǐng)域,也是應用最成功的。如商用系統(tǒng):TriUinmSowtfare、Pure Integrate(Oracle)、Quick Address(QAS Systems)等。它們用一個匹配工具抽取被清洗的數(shù)據(jù),并把姓名和地址信息轉(zhuǎn)換成單個標準元素、有效的3武漢理工大學碩士論文街道名、城市和郵政編碼。它們具體表現(xiàn)為使用一個大的預定義規(guī)則庫來處理在清洗過程中發(fā)現(xiàn)的問題。2)與領(lǐng)域無關(guān)的數(shù)據(jù)清洗與領(lǐng)域無關(guān)的數(shù)據(jù)清洗研究主要集中在清洗重復的記錄上【111,其主要工具包括:Data Blade Module,Choice Maker,Integrity,MegrePugre Library(SagentQMSotfware),Match IT(Help IT Systems),Master Megre(Pitney Bowes),DataCleanser(EDD)等。3)數(shù)據(jù)抽取、轉(zhuǎn)換和加載但TLExtractionTransformationLoading)-I-具中的數(shù)據(jù)清洗數(shù)據(jù)抽取、轉(zhuǎn)換和加載是數(shù)據(jù)倉庫系統(tǒng)中數(shù)據(jù)處理的關(guān)鍵操作。ETL就是根據(jù)數(shù)據(jù)處理的需要,將源數(shù)據(jù)對象經(jīng)過轉(zhuǎn)換后加載到目標數(shù)據(jù)對象中【12】。很多商業(yè)工具在多方面支持數(shù)據(jù)倉庫的ETL過程,如Ardent的Data Stage、Microsoft的Data Transformation Service、SAS的Warehouse Administrator和Informatica的Power Mart等。這些工具在關(guān)系數(shù)據(jù)庫系統(tǒng)上建立一個存儲器,以統(tǒng)一的方式管理關(guān)于數(shù)據(jù)源、目標模式、映射、腳本程序等所有元數(shù)據(jù)。通過文件、關(guān)系數(shù)據(jù)系統(tǒng)、以及標準接口(如JDBC、ODBC等),從數(shù)據(jù)源中抽取模式和數(shù)據(jù)。并提供圖形化的界面來定義數(shù)據(jù)轉(zhuǎn)換邏輯規(guī)則。這些ETL工具提供了大量數(shù)據(jù)的抽取、轉(zhuǎn)換和加載操作,但只對數(shù)據(jù)清洗提供有限支持。ETL工具并不是完全針對數(shù)據(jù)清洗而設計的。傳統(tǒng)的數(shù)據(jù)清洗軟件采用的策略有:1)將檢測“臟數(shù)據(jù)和進行修復操作的邏輯嵌入到系統(tǒng)各處的程序代碼中;2)讓用戶進行靈活但低效的手工判斷。前者當“臟數(shù)據(jù)的定義發(fā)生變化時,需要重新編譯數(shù)據(jù)清洗軟件,這在實際使用中是不可行的;后者則不能保證人工判斷的完整性和準確性171。文獻12為本文指出了一個可能的方向。該文提出了數(shù)據(jù)清洗規(guī)則的概念,給出了基于規(guī)則的數(shù)據(jù)清洗思路。本文的研究課題就是在上述背景下提出的,采取的方法是將一種開源的Java規(guī)則引擎-Drools應用于數(shù)據(jù)清洗,以此實現(xiàn)清洗規(guī)則的動態(tài)配置和及時更新,從而提高了數(shù)據(jù)清洗系統(tǒng)的可復用性、準確性和可擴展性。4武漢理工大學碩士論文15本文主要研究內(nèi)容1)研究分析了規(guī)則引擎的基本原理;2)研究分析了Java規(guī)則引擎的工作機制;3)研究分析了Java規(guī)則引擎的核心算法_Rete算法;4)研究分析了一種開源的Java規(guī)則引擎軟件包-Dr00ls,并系統(tǒng)地研究分析了其API的使用方法和規(guī)則配置文件的結(jié)構(gòu)和含義;5)研究分析了數(shù)據(jù)質(zhì)量和數(shù)據(jù)清洗的相關(guān)問題;6)研究分析了領(lǐng)域知識和清洗動作規(guī)則的巴科斯范式(BNF,BackusNaurForm)定義,闡述了一種基于Drools規(guī)則引擎的動態(tài)數(shù)據(jù)清洗系統(tǒng)的設計方案;7)詳細介紹了基于Drools規(guī)則引擎的動態(tài)數(shù)據(jù)清洗系統(tǒng)的規(guī)則數(shù)據(jù)庫設計、系統(tǒng)功能模塊劃分、系統(tǒng)結(jié)構(gòu)和工作流程,并給出了主要模塊的部分代碼和系統(tǒng)實驗性能分析結(jié)果。16本文的組織形式本文的主要內(nèi)容有5章,第1章是緒論,主要分析了本課題的研究背景,同時綜述了數(shù)據(jù)清洗技術(shù)的研究現(xiàn)狀及本文所做的主要工作。第2章分析了基于規(guī)則的專家系統(tǒng)的原理,Java規(guī)則引擎的工作機制和Rete算法的原理。對一種開源Java規(guī)則引擎Drools的API的使用進行了系統(tǒng)分析和介紹,并結(jié)合實例分析了其規(guī)則配置文件的結(jié)構(gòu)及含義。第3章詳細介紹了“臟數(shù)據(jù)的概念及數(shù)據(jù)質(zhì)量的概念及分類,并詳細介紹了數(shù)據(jù)清洗的概念、模型和流程。第4章闡述了基于Drools規(guī)則引擎的動態(tài)數(shù)據(jù)清洗系統(tǒng)的設計方案。首先給出了系統(tǒng)使用的兩種規(guī)則。接著詳細介紹了系統(tǒng)的詳細設計。第5章對全文進行了總結(jié),并對系統(tǒng)需要進一步所做的工作進行了展望。5武漢理工大學碩士論文第2章Java規(guī)則引擎的研究21規(guī)則引擎的原理規(guī)則引擎是基于規(guī)則專家系統(tǒng)(RBES,Rule-Based Expert system)的重要組成部分。下面先簡要地介紹一下RBES,以便深入地了解Java規(guī)則引擎。211基于規(guī)則的專家系統(tǒng)簡介RBES由三部分組成:規(guī)則庫知識庫(Rule BaseKnowledge Base)、-I-作內(nèi)存事實庫(Working MemoryFact Base)和推理引擎(Inference Engine)。它們之間的關(guān)系如圖2-1所示。圖2-1基于規(guī)則的專家系統(tǒng)構(gòu)成規(guī)則(知識)庫是中心數(shù)據(jù)庫,存儲著各種模擬人類問題求解的產(chǎn)生式規(guī)則。每一條規(guī)則分為兩部分:前件部分和后件部分。前件(Antecedent)3L稱條件部分、模式部分或左部(LeftHandSide,LHS),是規(guī)則觸發(fā)的條件。單獨的一個條件稱為條件元素或一個模式;后件(Consequent)又稱右部(RightHandSide,RHS),是規(guī)則觸發(fā)時將要執(zhí)行的一系列動作。工作內(nèi)存是應用于規(guī)則(知識)庫的全局數(shù)據(jù)庫,它保存系統(tǒng)的當前狀態(tài)。推理引擎通過決定哪些規(guī)則滿足工作內(nèi)存中的事實或目標,而授予規(guī)則優(yōu)先級,并將滿足事實或目標的規(guī)則加入議程安排器【131。如圖2-1所示,推理引擎6武漢理工大學碩+論文又可分成三部分:模式匹配器、議程安排器和執(zhí)行引擎。模式匹配器通過比較事實和規(guī)則的模式部分,決定選擇執(zhí)行哪個規(guī)則,何時執(zhí)行規(guī)則。它是基于規(guī)則的推理引擎的關(guān)鍵,并決定了推理引擎的推理效率;議程安排器是由推理引擎創(chuàng)建的一個規(guī)則優(yōu)先級表,這些規(guī)則都匹配工作內(nèi)存中的事實。如果同時有多個規(guī)則和事實匹配,則優(yōu)先級最高的先被觸發(fā)。被觸發(fā)規(guī)則的動作可能會產(chǎn)生新的事實,這些新的事實也會被加入工作內(nèi)存;執(zhí)行引擎負責執(zhí)行議程安排器中的規(guī)則和其他動作。 和人類的思維類似,推理引擎存在兩種推理方式:演繹法(ForwardChaining)和歸納法(BackwardChaining)。演繹法從一個初始的事實出發(fā),不斷地應用規(guī)則得出結(jié)論或執(zhí)行指定的動作。而歸納法則是根據(jù)假設,不斷地尋找符合假設的事實。Rete算法是目前效率最高的一個演繹法推理算法,許多Java規(guī)則引擎都是基于Rete算法來進行推理計算的。推理引擎的推理步驟如下:1)將初始事實數(shù)據(jù)載入工作內(nèi)存;2)使用模式匹配器比較規(guī)則庫中的規(guī)則和工作內(nèi)存中的事實數(shù)據(jù);3)如果執(zhí)行規(guī)則時存在沖突(Conflict),即同時激活了多個規(guī)則,則將沖突的規(guī)則放入沖突集合;4)解決沖突,將激活的規(guī)則按順序放入議程安排器;5)使用執(zhí)行引擎執(zhí)行議程安排器中的規(guī)則;6)重復步驟2)至5),直到議程安排器中的所有規(guī)則被執(zhí)行完畢。Java規(guī)則引擎就是從這一規(guī)則引擎的原始架構(gòu)演變而來【14I。212 Java規(guī)則引擎的工作機制Java規(guī)則引擎檢索提交到引擎的數(shù)據(jù)對象,根據(jù)這些對象的當前屬性值和它們之間的關(guān)系,從加載到引擎的規(guī)則庫中發(fā)現(xiàn)符合條件的規(guī)則,創(chuàng)建這些規(guī)則的執(zhí)行實例【151。這些實例將在引擎接到執(zhí)行指令時依照某種優(yōu)先順序依次執(zhí)行。一般來講,Java規(guī)則引擎內(nèi)部由如下幾部分構(gòu)成:工作內(nèi)存(Working Memory)或工作區(qū),用于存放被引擎引用的數(shù)據(jù)對象集合;規(guī)則執(zhí)行隊列,用于存放被激活的規(guī)則執(zhí)行實例;靜態(tài)規(guī)則區(qū),用于存放所有被加載的業(yè)務規(guī)則,這些規(guī)則將按照某種數(shù)據(jù)結(jié)構(gòu)組織。當工作區(qū)中的數(shù)據(jù)發(fā)生改變后,引擎需要迅速根7武漢理工大學碩士論文據(jù)工作區(qū)中的對象狀態(tài),調(diào)整規(guī)則執(zhí)行隊列中的規(guī)則執(zhí)行實例。Java規(guī)則引擎工作機制的示意圖如圖22所示。、。Java)立用程序規(guī)則引擎對象= 幻工慪、辦 、J ,U引用對象 Q, (對象y 1 f ,規(guī)則庫、J 靜態(tài)規(guī)則區(qū)廠 規(guī)則1 規(guī)則設定1規(guī)則2 規(guī)則設定2規(guī)則n 規(guī)則設定n1 |。上規(guī)則執(zhí)行隊列 圖2-2 Java規(guī)則引擎工作機制1141當引擎執(zhí)行時,會根據(jù)規(guī)則執(zhí)行隊列中的優(yōu)先級順序逐條執(zhí)行規(guī)則執(zhí)行實例,由于規(guī)則的執(zhí)行部分可能會改變工作區(qū)的數(shù)據(jù)對象,從而會使隊列中的某些規(guī)則執(zhí)行實例因為條件改變而失效,必須從隊列中撤銷,也可能會激活原來不滿足條件的規(guī)則,生成新的規(guī)則執(zhí)行實例進入隊列。于是就產(chǎn)生了一種動態(tài)的規(guī)則執(zhí)行鏈,形成規(guī)則的推理機制。這種規(guī)則的“鏈式”反應完全是由工作區(qū)中的數(shù)據(jù)驅(qū)動的。任何一個規(guī)則引擎都需要很好地解決規(guī)則的推理機制和規(guī)則條件匹配的效率問題。規(guī)則條件匹配的效率決定了引擎的性能,引擎需要迅速測試工作區(qū)中的數(shù)據(jù)對象,從加載的規(guī)則集中發(fā)現(xiàn)符合條件的規(guī)則,生成規(guī)則執(zhí)行實例,最武漢理:1=大學碩士論文后輸出匹配結(jié)果【161。1979年,美國卡耐基梅隆大學的Charles LForgy博士在其博士論文【17I中首次提出了一種叫做Rete的算法,很好地解決了這方面的問題。目前世界頂尖的商用規(guī)則引擎產(chǎn)品基本上都使用Rete算法。22 Rete算法研究”Rete”是拉丁語,相當于英語中的”Net”,是網(wǎng)絡的意思。Rete算法可以分為兩部分:規(guī)則編譯(Rule Compilation)和運行時執(zhí)行(Runtime Execution)。編譯算法描述了產(chǎn)生式內(nèi)存區(qū)或靜態(tài)規(guī)則區(qū)(Production Memory)qb的規(guī)則如何產(chǎn)生一個有效的辨別網(wǎng)絡(Discrimination Network)。辨別網(wǎng)絡通過數(shù)據(jù)在網(wǎng)絡的傳播過程中來過濾數(shù)據(jù)。在辨別網(wǎng)絡的頂端將會有很多匹配的數(shù)據(jù)。當順著網(wǎng)絡向下走,匹配的數(shù)據(jù)將會越來越少。在網(wǎng)絡的最底部是終端節(jié)點(TerminalNode)。在DrForgy的論文【17】中,描述了4種基本節(jié)點:根節(jié)點(Root Node),單輸入結(jié)點(1Input Node),雙輸入結(jié)點(2一Input Node)_;n終端結(jié)點(Terminal Node)。如圖23所示,在Drools規(guī)則引擎的辨別網(wǎng)絡中定義了8種節(jié)點類型:對象類型結(jié)點(ObjectType Node),阿爾法結(jié)點(Alpha Node),左輸入適配器結(jié)點(LeftlnputAdapter Node),求值結(jié)點(Eval Node),根節(jié)點(Rete Node),聯(lián)接結(jié)點(JomNode),存在結(jié)點(Not Node)和終端結(jié)點(Terminal Node)。下面的描述均使用圖23中的圖例來表示各種結(jié)點。對象類型結(jié)點(二) 根結(jié)點阿爾法結(jié)點二二7 聯(lián)接結(jié)點左輸入適配器結(jié)點求值結(jié)點廣-一存在結(jié)點終端結(jié)點圖2-3 Drools引擎中定義的8種節(jié)點類型根節(jié)點是所有的對象進入網(wǎng)絡的入口。然后,從根節(jié)點立即進入到對象類型結(jié)點,其作用是使引擎只做它需要做的事情。例如,有兩個對象集:帳戶類9口ooO武漢理工大學碩士論文(Account)和訂單類(Order)。如果規(guī)則引擎需要對每個對象都進行一個周期的評估,那會浪費很多的時間。為了提高效率,引擎將只讓匹配對象類型的對象到達節(jié)點。通過這種方法,如果某個應用聲明一個新的帳戶類對象,它不會被傳遞到訂單類對象類型節(jié)點中。很多現(xiàn)代Rete算法實現(xiàn)都有專門的對象類型結(jié)點。其中一些對象類型結(jié)點被用散列法進行了優(yōu)化。圖24說明了這一過程。根結(jié)點單圖24根結(jié)點向?qū)ο箢愋徒Y(jié)點的傳遞對象類型結(jié)點能夠傳播到阿爾法結(jié)點(對應單輸入結(jié)點),左輸入適配器結(jié)點和雙輸入結(jié)點(對應聯(lián)接結(jié)點和存在結(jié)點)。阿爾法結(jié)點被用來評估字面條件(Literal Conditions)。盡管在DrForgy的論文里只提到了相等條件(字面相等),很多Rete實現(xiàn)還支持其他的操作。例如, Accountname=”Zhang Shan”是一個字面條件。當一條規(guī)則對于一種對象類型結(jié)點有多條字面條件時,這些字面條件將被鏈接在一起。就是說,如果一個應用聲明一個Account類對象,在它能到達下一個阿爾法結(jié)點之前,它必須先滿足上一個字面條件。圖25說明了Account類的阿爾法結(jié)點組合:name=”Zhang Shan”,Id=”123456789”。Name=”Zhang Shan”圖2-5阿爾法結(jié)點的組合使用10甲定武漢理工大學碩士論文Drools通過散列法優(yōu)化了從對象類型結(jié)點到阿爾法結(jié)點的傳播。當一個阿爾法結(jié)點被加到一個對象類型結(jié)點的時候,就以字面值(Literal Value)作為鍵,以阿爾法結(jié)點作為值加入哈希表(HashMap)。當一個新的類實例進入對象類型結(jié)點的時候,不用傳遞到每一個阿爾法結(jié)點,可以直接從哈希表中獲得正確的阿爾法結(jié)點,避免了不必要的字面檢查。雙輸入節(jié)點對應于Drools中的兩種結(jié)點:聯(lián)接結(jié)點和存在結(jié)點(共同被稱為貝塔結(jié)點BetaNodes)。雙輸入節(jié)點被用來比較兩個對象及其屬性。這兩個對象可以是同種類型,也可以是不同類型。雙輸入節(jié)點的兩個輸入稱為左邊輸入(Left)和右邊輸X(Righ0。左邊輸入通常是一列對象(A list of objects)。在Drools中,這是一個數(shù)組。右邊輸入是單一對象。兩個存在結(jié)點可以完成存在性檢查。Drools將索引應用在雙輸入節(jié)點上,從而擴展了Rete算法。圖2-6說明了一個聯(lián)接結(jié)點的使用。Subject StudentStudentfavoriteSubject=Subjectname圖2-6聯(lián)接結(jié)點的使用圖中的左邊輸入用到了一個左輸入適配器結(jié)點,它的作用是將一個單一對象轉(zhuǎn)化為一個單對象數(shù)組(Single ObjectArray),再傳播到聯(lián)接節(jié)點。因為上面提到過左邊輸入通常是-YU對象(A list of objects)。終端結(jié)點被用來表明一條規(guī)則已經(jīng)匹配了它的所有條件(Conditions)。在這點,這條規(guī)則有了一個完全匹配(Full Match)。在一些情況下,一條帶有“或條件的規(guī)則可以有超過一個的終端結(jié)點。Drools引擎通過節(jié)點的共享來提高規(guī)則引擎的性能。因為很多的規(guī)則可能武漢理工大學碩士論文存在部分相同的模式,節(jié)點的共享可以對內(nèi)存中的節(jié)點數(shù)量進行壓縮,以提供遍歷節(jié)點的過程。下面的兩個規(guī)則就共享了部分節(jié)點。Rulel:whenSubject($subject:name=”Computer”)$student:Student(favouriteSubject=Ssubject)thenSystemoutprintln($persongetName0+”likes”+$subjectgetName0);endRule2:whenSubject(Ssubject:name=”Computer”)$student:Student(favouriteSubject!=Ssubject)thenSystemoutprintln($studentgetName0+”doesnot like”+$subjectgetName0);end這兩條規(guī)則的中的左邊(LHS,Left-HeadSide)基本是一樣的,只是最后的favouriteSubject,一條規(guī)則是等于$subject,而另一條規(guī)則是不等于$subject。圖27是這兩條規(guī)則的節(jié)點共享示意圖。12武漢理工大學碩士論文SubjectbjeclSystemoutprintln(StudentgetNameO+”does not like”+subjectgetNameO);圖27規(guī)則節(jié)點的共享從圖27可以看到,編譯后的Rete網(wǎng)絡中,阿爾法結(jié)點是共享的,而雙輸入結(jié)點不是共享的。這兩條規(guī)則都有各自的終端結(jié)點。Rete算法的第二個部分是運行時執(zhí)行(Runtime Execution)。當某個應用聲明一個對象后,Drools引擎將數(shù)據(jù)傳遞到根結(jié)點。然后它進入對象類型結(jié)點并沿著網(wǎng)絡向下傳播。當數(shù)據(jù)匹配一個節(jié)點的條件,節(jié)點就將它記錄到相應的內(nèi)存中。這樣做的主要原因是可以帶來更快的性能。雖然記住完全或部分匹配的對象需要大量的內(nèi)存,但這使它具有速度快和可伸縮的優(yōu)點。當一條規(guī)則的所有條件都滿足,這就是完全匹配。而只有部分條件滿足,就是部分匹配。13武漢理工大學碩士論文23 Drools規(guī)則引擎研究Drools是一款成功的開源Java規(guī)則引擎項目,它采用了高效的模式匹配算法一-Rete算法,實現(xiàn)了邏輯與數(shù)據(jù)的分離,采用的語言是當前流行的面向?qū)ο笳Z言Javao 231 Drools規(guī)則引擎APl分析Drools分為兩個主要部分:構(gòu)建(Authoring)時組件和運行時(Runtime)組件。構(gòu)建的過程涉及到drl或xml規(guī)則文件的創(chuàng)建,它們被讀入一個解析器,使用ANn盡3(即語言識別的另一個工具,ANother Tool for Language Recognition)語法進行解析。解析器對語法進行正確性的檢查,然后產(chǎn)生一種中問結(jié)構(gòu)tdescr”,”descr”用AST來描述規(guī)則。AST然后被傳到PackageBuilder類,由PackagBuilder類來產(chǎn)生Package對象。PackageBuilder類還承擔著一些代碼產(chǎn)生和編譯的工作,這對于產(chǎn)生Package對象都是必需的。Package對象是一個可以配置的,可序列化的,由一個或多個規(guī)則組成的對象。圖2-8說明了它們之間的相互關(guān)系。圖2-8 Drools規(guī)則引擎的構(gòu)建時組件RuleBase是一個運行時組件,它包含了一個或多個Package對象??梢栽谌魏螘r刻將一個Package對象加入或移出RuleBase對象。一個RuleBase對象可以在任意時刻實例化一個或多個WorkingMemory對象,在它的內(nèi)部保持對這些Working;Memory的弱引用。WorkingMemory由一系列子組件組成。當應用程序中的對象被聲B)l(assea)進WorkingMemory,可能會導致一個或多個激活(Activation)的產(chǎn)生,然后由Agenda負責安排這些激活的執(zhí)行。圖2-9說明了它14武漢理工大學碩七論文們的相互關(guān)系。圖2-9 Drools規(guī)則引擎的運行時組件主要有三個類用來完成規(guī)則的構(gòu)建過程:DrlParser,XmlParser和PackageBuilder。前兩個解析器類(DrlParser類和XmlParser類)從傳入的Reader類實例產(chǎn)生descrAST模型。下面將詳細分析Drools規(guī)則引擎主要類(接口)的使用。1PackageBuilder類提供了簡便的API,使得可以忽略DrlParser和XmlParser這兩個解析器類的存在。這兩個簡單的方法是:”addPackageFromDrl0”和”addPackageFromXml0”,兩個方法都只要傳入一個Reader類的實例作為參數(shù)。下面的例子說明了如何從類路徑(ClassPath)下的xml或drl文件創(chuàng)建一個Package對象。所有傳入同一個PackageBuilder實例的規(guī)則源,都必須是在相同的包(package)命名空間中。下面的代碼段演示了如何從指定的類路徑下讀取規(guī)則配置文件,并生成一個Package對象:PackageBuilder builder=new PackageBuilder0;builderaddPackageFromDrl(new lnputStreamReader(getClass0getResourceAsStream(”packageldrl”);builderaddPackageFromXml(new InputStreamReader(getClass0getResourceAsStream(”package2drl”);Package pkg=buildergetPackage0;PackageBuilder類的使用如圖210所示。15武漢理工大學碩士論文圖2-10 PackageBuilder類的類圖PackageBuilder可以通過PackageBuilderConfiguration類進行配置。可以指定另一個父類加載器(parent ClassLoader)和編譯器類型(默認是JDT)。PackageBuilderConfiguration類的使用如圖211所示。O bject今IPackageBuild erC0nfiguFationECLIPSE:intJANIN0:int+PackageB Uilde rConfigUration0+getC lassLoader()+setClassLoader()+getCom PilerO+setCOm Piler()圖211 PackageBuilderConfiguration類的類圖下面的代碼段演示了如何指定JANINO編譯器:通常,EclipsePackageBuilderConfiguration conf=lleW PackageBuilderConfiguration0;confsetCompiler(PackageBuilderConfigurationJANINO);PackageBuilder builder=new PackageBuilder(conf);16武漢理工大學碩士論文下面的代碼段演示了如何設置JDK的版本為15:PackageBuilderConfiguration conf=new PackageBuilderConfiguration0;confsetJavaLanguageLevel(”15”);PackageBuilder builder=new PackageBuilder(conf);2一個RuleBase類包含了多個將被使用的規(guī)則包(Packages of Rules)的引用。RuleBase類是可序列化的,所以它可以被配置到JNDI(Java Naming andDirectory Interface)或其他類似的服務中。通常,第一次使用時,一個RuleBase類被創(chuàng)建并緩存。RuleBase類由工廠類RuleBaseFactory來實例化,默認返回一個RETE00型的RuleBase??梢詡魅?yún)?shù)來指定返回的RuleBase類的類型(包括RETEOO或LEAPS兩種)。然后,用addPackage方法加入Package實例??梢约尤胗邢嗤說ffJ(NameSpace)的多個Package實例。RuleBase類的使用如圖212所示。RuleBaseI EAPS:intRETEOO:int+addPackage(in Package)+getPackages0+getWorkingMemories0+newWorkingMemory0+newWorkingMemory(in boolean)+removeRule(in String)+removePackage(in String,in String)圖212 RuleBase類的類圖下面的代碼段演示了如何創(chuàng)建一個RuleBase類的對象:RuleBase ruleBase=RuleBaseFactorynewRuleBase0;默認返回一個RETEOO型RuleBase ruleBase=RuleBaseFactorynewRuleBase(RuleBaseLEAPS);LEAPS型RuleBase實例是線程安全的,所以可以讓一個RuleBase實例在多個線程中共享。對于一個RuleBase的最常用的操作是產(chǎn)生一個新的WorkingMemory類。一個RuleBase實例保持著到它所產(chǎn)生的WorkingMemory類的弱引用,所以在長時間運行的WorkingMemory類中,如果其中的規(guī)則發(fā)生改變,這些WorkingMemory類可以及時地根據(jù)最新的規(guī)則進行自動更新,而不必重啟17武漢理工大學碩士論文WorkingMemory類。也可以指定RuleBase不必保持一個弱引用,但是要保證RuleBase類不能被更新。下面的代碼段演示了如何由RuleBase對象生成一個WorkingMemory實例:ruleBasenewWorkingMemorY0;保持指向WorkingMemory的弱引用ruleBasenewWorkingMemory(false);不保持指向WorkingMemory的弱引用任何時候,Package類實例可以被加入或移除;這些改變都會被反映到現(xiàn)存的WorkingMemory類中。下面的代碼段演示了如何加入和移除一個包實例:ruleBaseaddPackage(pkg);an入一個包實例ruleBaseremovePackage(”tomderules”);移除同一包下的所有規(guī)則ruleBaseremoveRule(”tomderules tt9”Hello Rules”);移除某一包下的一條規(guī)則雖然有刪除一個單獨規(guī)則的方法,但是卻沒有加入一個單獨規(guī)則的方法,要達到這個目的只有加入一個只含有一條規(guī)則的包。3RuleBaseConfiguration類可以指定RuleBase類的附加行為。在加入RuleBase后,RuleBaseConfiguration就變成不可變對象。下面的代碼段演示了如何設置工作內(nèi)存聲明對象的模式為相等模式(見WorkingMemory類的分析):RuleBaseConfiguration conf=nCW RuleBaseConfiguration O;conLsetProperty(RuleBaseConfigurationPROPERTY_ASSERT_BEHAVIOR,RuleBaseConfigurationWM BEHAVIOR_EQUALrIY);RuleBase ruleBase=new ReteooRuleBase(conf);4WorkingMemory類是運行時規(guī)則引擎的核心類。它保持了所有被聲明到WorkingMemory的數(shù)據(jù)的引用,直到撤消(Retracted)。WorkingMemory是有狀態(tài)對象。它們的生命周期可長可短。如果從一個短生命周期的角度來同一個引擎進行交互,意味著可以使用RuleBase對象來為每個會話產(chǎn)生一個新的WorkingMemory,然后在結(jié)束會話后釋放這個WorkingMemory(產(chǎn)生一個WorkingMemory是一個廉價的操作)。另一種形式,就是在一個相當長的時間中,保持一個WorkingMemory,并且對于新的Facts保持持續(xù)的更新。當希望釋放一個WorkingMemory的時候,最好的實踐是調(diào)用它的dispose0方法,此時RuleBase中對它的引用將會被移除(盡管這是一個弱引用)。不管怎樣最后它將會被當成垃圾收集掉。圖213給出了WorkingMemory類的主要方法的使用。18武漢理工大學碩士論文SerializablelWorkingMemory+addEventListener(in AgendaEventListener)+addEventListener(in WorkingMemoryEventListener)+assertO 6,ect(in 0bject)+assertObject(in 0bjeer,in boolean)+disposeO+fireA llRu les O+fireAllRules(in AgendaFilter)+retractObject(in FactHandle)+setFocus(in AgendaGroup)+modifyObject(in FactHandle,in 0bjecO+getAgenda 0+removeEventListener(in AgendaEventListener)+removeEventListener(in WorkingMemoryEventListener)+setGlobal(in String,in 0bjecO+clearAgenda0+clearAgendaGroup0,+getRuleBase(in RuleBase) 霉礦+setAsyncExceptionHandler(in AsyncExceptionHandler)+getGlobalsO+getG tobnttn String)圖2-13 WorkingMemory類的類圖WorkingMemory類的使用分為如下幾方面:1)FactsFacts是在某一應用中,被聲明到WorkingMemory中的標準JavaBean對象。Facts是規(guī)則可以訪問的任意的Java對象。規(guī)則引擎中的Facts并不是拷貝應用中的數(shù)據(jù),它只是持有應用中數(shù)據(jù)的引用。String類和其他沒有g(shù)etter和setter方法的類不是有效的Fact。這樣的類不能使用域約束(Field Constraints),因為使用域約束要依靠JavaBean標準的getter和setter方法來同對象交互。2)AssertionAssertion是將Facts告訴給WorkingMemory類的動作, 即WorkingMemoryassertObject(yourObject)。當應用中聲明了一個Fact,它將被檢19武漢理工大學碩士論文查是否匹配規(guī)則。這意味著所有的匹配工作將會在聲明的過程中完成。盡管如此,當聲明完Fact之后,還要調(diào)用fireAllRules0方法來執(zhí)行規(guī)則。當一個對象被聲明后,會返回一個FactHandle類。這個FactHandle類是一個代表在WorkingMemory中的己聲明對象的令牌(Token)。當希望收回(Retract)或者修改(Modify)-個對象時,這個令牌用來同WorkingMemory進行交互。下面的代碼片段演示了這一過程:Student stu=new Student(jason”);FactHandle jasonHandle=workingMemoryassertObject(stu);WorkingMemory有兩種聲明對象的模式:同一模式(Identity)和相等模式(Equality),默認是同一模式。在同一模式下, WorkingMemory使用一個IdentityHashMap類來存儲所有已聲明的對象(Object)。這個模式下,當被聲明的對象(Object)是同一個實例時(即有相等的hashCode0方法返回值),它返回同一個FactHandle。在相等模式下,WorkingMemory使用一個HashMap來存儲所有已聲明對象。這個模式下,當被聲明的對象相等(即有相同的equals0方法返回值)時,它也返回同一個FactHandle。3)Retraction基本上就是聲明(assert)的逆操作。當撤消(Retract)一個Fact時,WorkingMemory將不再跟蹤那個Fact。任何被激活(Activated)并依賴那個Fact的規(guī)則將被取消。完全有可能存在某條規(guī)則是依賴于一個不存在的Fact。在這種情況下,撤消(Retra一個Fact可能導致一條規(guī)則被激活。要撤消一個已聲明的對象,必須用聲明該對象時返回的那個FactHandle類實例做為參數(shù)。下面的代碼段演示了如何撤消一個已聲明的對象:yourObject 0bj=new yourObject(”obj_name”);FactHandle myHandle=workingMemoryassertObject(obj);。某些操作workingMemoryretractObject(myHandle);4)Modification當一個Fact被修改了,必須通知規(guī)則引擎進行重新處理。在規(guī)則引擎內(nèi)部實際上是對舊的Fact進行撤消操作,然后對新的對象再進行聲明操作。要使用modifyObject0方法來通知WorkingMemory,被改變的Object并不會自己通知武漢理工大學碩士論文規(guī)則引擎。modifyObject0方法總是要把被修改的Object做為第二參數(shù),這就可以把一個不可變對象替換為另一個新對象。下面的代碼段演示了如何修改一個已聲明對象:yourObject obj=new yourObject(”objname”);FactHandle myHandle=workingMemoryassertObject(obj);。某些操作objsetName(anothername”);workingMemorymodifyObject(myHandle,obj);5)GlobalsGlobal是一個能夠被傳進WorkingMemory但不需要聲明的命名對象。大多數(shù)這樣的對象被用來作為靜態(tài)信息或服務。這些服務被用在一條規(guī)則的后件(RHS,RightHandSide),或者可能是從規(guī)則引擎返回對象的一種方法。下面的代碼段聲明的一個名為”list”的元素為String型順序表對象:Listlist=new ArrayListO;workingMemorysetGlobal Clist”,list);setGlobal0方法傳進去的命名對象必須同RuleBase中的定義具有相同的類型(即同規(guī)則文件中用Global關(guān)鍵字所定義的類型相同),否則會拋出一個運行時異常(RuntimeException)。如果在setGlobal方法調(diào)用之前就引用了定義的Global對象,則會拋出一個空指針異常(NullPointerException)。6)屬性改變監(jiān)聽器(Property Change Listener)如果Fact對象是一個JavaBean(具有g(shù)etter和setter方法),可以為它們實現(xiàn)一個屬性改變監(jiān)聽器,然后把它告訴給規(guī)則引擎。這意味著,當一個Fact改變時,規(guī)則引擎將會自動知道,并進行相應的動作(這時就不需要調(diào)用modifyObject0方法來通知WorkingMemory)。要讓屬性改變監(jiān)聽器生效,首先要將Fact設置為動態(tài)(Dynamic)模式,這可以通過將布爾值true做為assertObject0方法的第二個參數(shù)來實現(xiàn)。下面的代碼段演示了這一過程:Student jason=new Student(”Jason”);FactHandle jasonHandle=workingMemoryassenObjeCt(jason,true);指定以動態(tài)模式加載一個對象然后要在Student類中加入一個PropertyChangeSuppon類的實例變量和兩個方法:addPropertyChangeListener0和removePropertyChangeListener0。最后要21武漢理工大學碩士論文在該對象(Student)的setter方法中通知PropenyChangeSupport所發(fā)生的變化。示例代碼如下:private final PropertyChangeSupport changes=new PropertyChangeSupport(this);public void addPropertyChangeListener(final PropertyChangeListener 1)thischangesaddPropertyChangeListener(1);)public void removePropertyChangeListener(final PropertyChangeListener 1)thischangesremovePropertyChangeListener(1);)public void setName(final String newName)String oldName=thisgetName0;thisname-newName;thischangesfirePropertyChange(”name”,oldName,newName);)5Agenda是Rete算法的一個特點。在一個工作內(nèi)存活動發(fā)生時,可能會有多條規(guī)則發(fā)生完全匹配。當一條規(guī)則完全匹配的時候,一個激活(Activation)類就被創(chuàng)建(它引用了這條規(guī)則和與其匹配的Facts),然后被放進Agenda中。Agenda通過使用沖突解決策略(Conflict Resolution Strategy)來安排這些激活的執(zhí)行。Drools規(guī)則引擎工作在一個“兩階段”(TwoPhase)模式下:1)工作內(nèi)存活動階段:聲明進新的Facts,修改現(xiàn)有的Facts和收回現(xiàn)有的Facts都是工作內(nèi)存活動。通過在應用程序中調(diào)用fireAllRules0方法,會使引擎轉(zhuǎn)換到議程器評估階段。2)議程安排器評估階段:嘗試選擇一條規(guī)則進行觸發(fā)(Fire)。如果規(guī)則沒有找到就退出,否則它就嘗試觸發(fā)這條規(guī)則,然后再次轉(zhuǎn)換到工作內(nèi)存活動階段。這個過程一直重復,直到議程安排器為空,此時控制權(quán)就回到應用程序中。當工作內(nèi)存活動發(fā)生時,沒有規(guī)則正在被觸發(fā)。圖214說明了這個兩階段工作循環(huán)的過程。武漢理工大學碩士論文圖214 Drools規(guī)則引擎的兩階段工作過程議程安排器r(Agenda)的T作任務表現(xiàn)在以下兩個方面:1 1解決沖突(Conflict Resolution)當有多條規(guī)則在議程安排器中,就需要解決沖突。當觸發(fā)一條規(guī)則時,會對工作內(nèi)存產(chǎn)生副作用。規(guī)則引擎需要知道規(guī)則以什么順序被觸發(fā)(例如,觸發(fā)規(guī)則A可能會引起規(guī)則B被從議程安排器中移除。)Drools采取的沖突解決策略有兩種,按照使用頻度分為: Salience,LIFO(LastInFirstOut)。最常用的策略是Salience,即優(yōu)先級策略,用戶可以為某個規(guī)則指定一個高一點的優(yōu)先級(通過賦給它一個比較大的數(shù)字)。具有高Salience值的規(guī)則將被優(yōu)先激發(fā)。2)議程安排器組(Agenda Groups)議程安排器組是劃分議程安排器中規(guī)則(即處于激活狀態(tài)的規(guī)則)的一種方法。在任意一個時刻,只有一個議程安排器組擁有焦點(Focus),這意味著只有在那個組中的激活才是有效的。議程安排器組是在規(guī)則組之間創(chuàng)建一個流(Flow)的簡便的方法??梢栽谝?guī)則引擎中,或是用API來切換具有焦點的組。如果規(guī)則有很明確的多階段(Phasesl或多序YlJ(Sequences)的處理,可以考慮用議程安排器組來達到這個目的。每次調(diào)用setFocus0方法的時候,那個議程安排器組就會被壓入一個堆棧,當這個有焦點的組為空時,它就會被彈出,然后下一個組就會被執(zhí)行。一個議程安排器組可以出現(xiàn)在堆棧的多個位置。默認的議程安排器組是”MAIN”,所有沒有被指定議程安排器組的激活態(tài)規(guī)則都被放到那個組中,這個組總是被放在堆棧的第一個組,并默認給予焦點。武漢理T大學碩十論文6AgendaFilter接口,用來允許或禁止一個激活的規(guī)則能夠被觸發(fā)(Fire)。Drools提供了下面幾種方便的默認實現(xiàn)類:RuleNameEndWithAgendaFilter、RuleNameEqualsAgendaFilter和RuleNameStartsWithAgendaFilter。要使用一個過濾器就要在調(diào)用fireAllRules0方法的時候指定它。下面的代碼段將對所有名字以”Pass”結(jié)尾的規(guī)則進行過濾,即禁止其被觸發(fā):workingMemoryfireAllRules(new RuleNameEndsWithAgendaFilter CPass”);7Event包里提供了規(guī)則引擎的事件機制,包括規(guī)則被觸發(fā),對象已經(jīng)被聲明等事件。可以使用事件機制來進行面向切面的編程(AOP,AspectOrientedProgramming)編程。有兩種類型的事件監(jiān)聽器:WorkingMemoryEventListener和AgendaEventListener。圖215和圖216給出了它們的類圖。WorkingMemoryEventListener+objectgsserted(in ObjectAssertedEvent)+objectModified(in ObjectModifiedEvenO+objectRetracted(in ObjectRetractedEvenO圖2-15 WorkingMemoryEventListener類的類圖AgendaEventListener+activationCanceltedon ActivationCancelledEven0+activationCreated(in ActivationCreatedEvenO+afterActivationFired(in AfierActivationFiredEvenO+beforeActivationFired(in BeforeActivationFiredEvenO圖21 6 AgendaEventListener類的類圖對兩個EventListener接口都提供了默認實現(xiàn),但在方法中并沒有做任何事情??梢岳^承DefaultAgendaEventListener和DefaultWorkingMemoryEventListener這兩個默認實現(xiàn)類來完成自己的實現(xiàn)。下面的代碼段演示了如何擴展一個DefaultAgendaEventListener并把它加到WorkingMemory類中,例子中只實現(xiàn)了afterActivationFired0方法。workingMemoryaddEventListener(new DefaultAgendaEventListener 0public void aflerActivationFired(AfterActivationFiredEvent event)24武漢理工大學碩士論文superafterActivationFired(event);Systemoutprintln(event););Drools規(guī)則引擎也提供了DebugWorkingMemoryEventListener和DebugAgendaEventListener兩個事件監(jiān)聽實現(xiàn)類,在其方法中實現(xiàn)了調(diào)試(Debug)信息的輸出。下面的代碼將DebugWorkingMemoryEventListener這個事件監(jiān)聽類加到工作內(nèi)存中。workingMemoryaddEventListener(new DebugWorkingMemoryEventListener O);232 Drools規(guī)則配置文件(drl)的結(jié)構(gòu)和含義因為本文在第四章將要介紹基于Drools規(guī)則引擎的動態(tài)數(shù)據(jù)清洗,并采用XML文件做為其規(guī)則配置文件的格式,在此先結(jié)合一個完整的配置文件的實例來分析Drools規(guī)則配置文件的結(jié)構(gòu)及含義。在寫此文時,Drools已經(jīng)被合并到JBoss組織下,改名為JBossRules。為了實現(xiàn)規(guī)則的動態(tài)、實時、自動地配置,本文以Drools 21為例,因為其規(guī)則配置文件是XML格式的,便于使用JDOM,DOM4J等工具對其進行讀寫和更新。Drools 21的規(guī)則配置文件的結(jié)點結(jié)構(gòu)由XSD(XML Schema Definition)格式文檔所定義,詳見附錄一。一個完整的Drools 21規(guī)則配置文件(drl文件)的實例如下:java1angObjectjava1angStringdroolsStudentdroolsRecommendation武漢理工大學碩士論文public static void printStudent(student student)Systemoutprintln(”nStudent Name:”+studentgetStudentName0+”11 Sudent Age:”+studentgetStudentAge0+”Il Student Sex:”+studentgetStudentSex0+”n Recommend”+studentgetSIudentNameO+I190 to schoole”+studentgetSchoole0+”:”+studentgetRecommend0);)droolsStudentstudentgetSchoole0equals(”USST”)studentgetStudentAge0 15 &;&;studentgetGender=F勺ava:consequencestudentsetRecommend(RecommendationYES);printStudent(student);droolsStudent武漢理工大學碩士論文studentgetSchoole0equals(”FUDAN”)studentgetStudentAge018studentsetRecommend(RecommendationYES);printstudent(student);從以上的規(guī)則配置文件例子可以分析得出,Drl文件的結(jié)構(gòu)如圖217所示。圖217 Drools規(guī)則配置文件的結(jié)構(gòu)如圖217所示,每個配置文件有且僅有一個ruleset結(jié)點;每個ruleset結(jié)點一般有三部分組成:java:import結(jié)點(可有多個),java:functions結(jié)點,rule結(jié)點(可有多個,以name屬性區(qū)分);每個rule結(jié)點有三部分組成:parameter結(jié)點,java:condition結(jié)點,java:consequence結(jié)點。配置文件必須滿足以下要求:必須有一個ruleset結(jié)點;每個ruleset結(jié)點至少有一個rule結(jié)點;每個rule結(jié)點必須在ruleset結(jié)點中有唯一的名字(name);每個rule結(jié)點至少有一個parameter結(jié)點,且在rule內(nèi)必須有唯一的標識符(identifer);java:condition結(jié)點中不能有分號;java:consequence結(jié)點中必須有分號。需要注意的是,在Drools規(guī)則配置文件中,一些在Java中的運算符號不能武漢理工大學碩士論文直接寫,比如“”,“”,“&”,例如上面的“&”就寫成“&;&;”,如果是“”,就應該寫成“l(fā)t;”,以此類推。Drl配置文件中各個結(jié)點的含義如下:每個java:import結(jié)點用來導入將要在java:functions結(jié)點,java:condition結(jié)點和java:consequence結(jié)點中用到的Java類;在java:functions結(jié)點中定義了將要在iava:condition結(jié)點和java:consequence結(jié)點中用到的函數(shù);java:condition結(jié)點中定義了規(guī)則被觸發(fā)的條件,多個java:condition結(jié)點間是邏輯與的關(guān)系;parameter結(jié)點聲明了將要在java:condition結(jié)點和java:consequence結(jié)點中用到的變量名;java:consequence結(jié)點定義了規(guī)則被觸發(fā)時將要執(zhí)行的動作;每個java:condition結(jié)點中的內(nèi)容是一個邏輯表達式:每個java:consequence結(jié)點中的內(nèi)容是一條或多條可被JVM(JavaVirtual Machine)執(zhí)行的Java代碼段。24本章小結(jié)本章首先分析了基于規(guī)則的專家系統(tǒng)的結(jié)構(gòu)原理和Java規(guī)則引擎的工作機制,然后分析了規(guī)則引擎的核心-Rete算法的原理,最后對一種開源Java規(guī)則引擎Drools的API的使用進行了系統(tǒng)地分析和介紹,并結(jié)合實例分析了其規(guī)則配置文件的結(jié)構(gòu)及含義。這些,都為后面詳細闡述基于Drools規(guī)則引擎的動態(tài)數(shù)據(jù)清洗系統(tǒng)提供了理論基礎(chǔ)。武漢理工大學碩士論文31數(shù)據(jù)質(zhì)量第3章數(shù)據(jù)清洗的概念311臟數(shù)據(jù)的概念“臟數(shù)據(jù)”是指數(shù)據(jù)不在給定的范圍內(nèi)或?qū)τ趯嶋H業(yè)務毫無意義,或是數(shù)據(jù)格式非法,以及錯誤操作發(fā)生等。主要表現(xiàn)為:數(shù)據(jù)格式錯誤,數(shù)據(jù)不一致,數(shù)據(jù)重復、錯誤,業(yè)務邏輯的不合理,違反業(yè)務規(guī)則等。例如,未經(jīng)驗證的身份證號碼、日期字段等,年齡超過取值范圍,濫用縮寫詞、數(shù)據(jù)輸入錯誤、重復記錄、丟失值、拼寫變化、不同的計量單位和過時的編碼等等。當今用戶所面對的是一個多廠商異種數(shù)據(jù)庫、異種操作系統(tǒng)和異種網(wǎng)絡的環(huán)境,異種數(shù)據(jù)庫間互聯(lián)成為人們越來越迫切的需求。對于實際運行的系統(tǒng)來說,有許多因素都可能引起數(shù)據(jù)庫系統(tǒng)之間的差異性,因此在異構(gòu)數(shù)據(jù)集成中存在大量“臟數(shù)據(jù)”Ds。312數(shù)據(jù)質(zhì)量的概念數(shù)據(jù)質(zhì)量問題并不僅僅是指數(shù)據(jù)錯誤。文獻19】以形式化的方法定義了數(shù)據(jù)的一致性(Consistency)、正確性(Correctness)、完整性(Completeness)和最小性(Minimality),數(shù)據(jù)質(zhì)量被定義為這4個指標在信息系統(tǒng)中得到滿足的程度。文獻201提出了數(shù)據(jù)工程中數(shù)據(jù)質(zhì)量的需求分析和模型,認為存在很多候選的數(shù)據(jù)質(zhì)量衡量指標,用戶應根據(jù)應用的需求選擇其中一部分。數(shù)據(jù)質(zhì)量衡量指標分為兩類:數(shù)據(jù)質(zhì)量指示器和數(shù)據(jù)質(zhì)量參數(shù),前者是客觀的信息,比如數(shù)據(jù)的收集時間,來源等,。而后者是主觀性的,比如數(shù)據(jù)來源的可信度(Credibility)、數(shù)據(jù)的及時性(Timeliness)等。文獻f21】提出了一些數(shù)據(jù)質(zhì)量的評估指標。在進行數(shù)據(jù)質(zhì)量評估時,要根據(jù)具體的數(shù)據(jù)質(zhì)量評估需求對數(shù)據(jù)質(zhì)量評估指標進行相應的取舍。數(shù)據(jù)質(zhì)量評估至少應該包含以下兩方面的評估指標瞄刪。1)可信度。它的具體含義如下:精確性:描述數(shù)據(jù)是否與其對應的客觀實體的特征相一致。武漢理j大學碩士論文完整脾llt=:兀蜀 :一致性:有效性:唯一性:2)可用性。時效性:穩(wěn)定性:描述數(shù)據(jù)是否存在缺失記錄或缺失字段。描述同一實體的同一屬性的值在不同的系統(tǒng)是否一致。描述數(shù)據(jù)是否滿足用戶定義的條件或在一定的域值范圍內(nèi)。描述數(shù)據(jù)中是否存在重復記錄。它的具體含義如下:描述數(shù)據(jù)是當前數(shù)據(jù)還是歷史數(shù)據(jù)。描述數(shù)據(jù)是否是穩(wěn)定的,是否在其有效期內(nèi)。313數(shù)據(jù)質(zhì)量問題的分類根據(jù)處理的是單數(shù)據(jù)源還是多數(shù)據(jù)源以及問題出在模式層還是實例層,文獻【7】將數(shù)據(jù)質(zhì)量問題分為四類:單數(shù)據(jù)源模式層問題、單數(shù)據(jù)源實例層問題、多數(shù)據(jù)源模式層問題和多數(shù)據(jù)源實例層問題,如表3-1所示。表31數(shù)據(jù)質(zhì)量分類數(shù)據(jù)源 單數(shù)據(jù)源 多數(shù)據(jù)源層次 模式層 實例層 模式層 實例層產(chǎn)生原 缺少完整性約束; 數(shù)據(jù)記錄錯 異構(gòu)的數(shù)據(jù)模 不一致的數(shù)據(jù)因 差的模式設計 誤 式和模式設計 匯總表現(xiàn)形 違反實體完整性約 拼寫錯誤 命名沖突; 冗余,矛盾及式 束和參照完整性約 等;相似重 模式?jīng)_突 不一致的數(shù)據(jù)束 復記錄 無論是模式層問題還是實例層問題,都可以分成字段、記錄、記錄類型和數(shù)據(jù)源四種不同的問題范圍,分別說明如下:字段:錯誤僅局限于單個字段值中。記錄:錯誤表現(xiàn)在同一條記錄中不同字段值之間出現(xiàn)的不一致。記錄類型:錯誤表現(xiàn)在同一個數(shù)據(jù)源中不同記錄之間的不一致關(guān)系。數(shù)據(jù)源:錯誤表現(xiàn)在數(shù)據(jù)源中的某些字段值和其它數(shù)據(jù)源中相關(guān)值的不一致關(guān)系。1單數(shù)據(jù)源中的數(shù)據(jù)質(zhì)量問題表32和表33分別給出了單數(shù)據(jù)源中模式層和實例層中數(shù)據(jù)質(zhì)量問題的實例。武漢理_T大學碩士論文表32單數(shù)據(jù)源中模式層的數(shù)據(jù)質(zhì)量問題范圍 問題 臟數(shù)據(jù) 原因字段 不合法值 Birthday=1981-1376 超出值域記錄 違反屬性依賴 Age=65,birthday=200712一01 age=sysdate-birthday記錄類 違反唯一性 Porviderl:Name=A1,NO=P001; 編號不唯一型 Porvider2:Name=A2,No=P001數(shù)據(jù)源 違反參照完整 Provider:Name=A1, 編號為101的城市性 CityNo=101 不存在表33單數(shù)據(jù)源中實例層的數(shù)據(jù)質(zhì)量問題范圍 問題 臟數(shù)據(jù) 原因字段 空值 PhoneNo=(0000)O(O)000 值為缺省值,可能數(shù)據(jù)未輸入或已丟失拼寫錯誤 City=漢鐘 一般為數(shù)據(jù)錄入錯誤含義模糊 Position=DBPorg DBPorg意義不清的值、多值嵌入 Name=漢中鋼鐵集團723000漢中 一個字段中輸入多個字段的值字段值錯 City=漢臺區(qū) 某個字段的值輸入位 到另一個字段中記錄 違反屬性 City=漢中,zip=710000 城市和郵政編輯之依賴 間不一致記錄 重復記錄 供應商1:(漢中鋼鐵集團,漢中) 由于輸入錯誤,同一類型 供應商2:(漢臺區(qū)鋼鐵集團,漢中-) 個供應商信息輸入了兩次沖突的值 供應商1:(漢中漢航集團,1) 一個供應商用不同供應商2:(漢中漢航集團,2) 的值表示數(shù)據(jù) 引用錯誤 供應商:Name=漢中煙草集團, 供應商與城市編號源CityNo=1 不能一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年智能寵物定量喂食器項目項目建議書
- 2026年清潔氫項目投資計劃書
- 2026年智能車載后視鏡項目評估報告
- 黃逗逗課件教學課件
- 印花電腦分色工保密意識強化考核試卷含答案
- 月殼厚度測量
- 醫(yī)學人文與溝通:突發(fā)公共衛(wèi)生事件溝通提升課件
- 施工現(xiàn)場氣象信息管理方案
- 橋梁外部環(huán)境監(jiān)測方案
- 市政管網(wǎng)改造工程設計方案
- 2025年國家開放大學《公共經(jīng)濟學》期末考試備考試題及答案解析
- 2023年貴州省部分法院聘用制書記員招聘524名筆試參考題庫(共500題)答案詳解版
- 個人借款借條電子版篇
- 2023年世界上最坑人的搞笑腦筋急轉(zhuǎn)彎整理
- 廣西建設領(lǐng)域?qū)I(yè)技術(shù)人員三新技術(shù)網(wǎng)絡培訓考試題目及答案
- 情緒的作文400字五篇
- 【藍光】藍光電梯的調(diào)試資料
- NY/T 682-2003畜禽場場區(qū)設計技術(shù)規(guī)范
- GB/T 33725-2017表殼體及其附件耐磨損、劃傷和沖擊試驗
- FZ/T 01057.1-2007紡織纖維鑒別試驗方法 第1部分:通用說明
- 實習協(xié)議模板(最新版)
評論
0/150
提交評論