【Java开源代码栏目提醒】:网学会员在Java开源代码频道为大家收集整理了“基于Java规则引擎的动态数据清洗研究与设计 - 计算机教材“提供大家参考,希望对大家有所帮助!
武汉理工大学硕士学位
论文基于
Java规则引擎的动态数据清洗研究与设计别:硕士专业:
计算机应用技术指导教师:王舜燕20080501摘要在运营管理过程中,企业积累了大量的、极为重要的电子数据。
业务决策者在进行分析决策时对这些数据的依赖性日益增强,错误或冲突的数据很可能会导致错误的决策,从而给企业造成巨大的损失。
因此在这些数据进入决策系统之前需要对其进行处理,以提高决策系统的可信度和可用性。
为解决上述问题,业界提出了数据清洗的解决方案,即从大量原始数据中按一定规则(领域知识规则)检测出“脏数据”并按一定的规则(清洗动作规则)修复或丢弃之。
传统的数据清洗工具存在以下不足:“脏数据’’的检测和修复逻辑被嵌入到复用性差的硬编码中或依赖于灵活但低效的手工判断。
当“脏数据’’的定义发生变化时需要修改源
代码并重新编译生成清洗软件,这在实际使用中是低效的。
Java规则引擎的出现,为基于动态、可配置规则的数据清洗方式提供了可行的技术基础。
本文介绍了规则引擎的基本原理,分析了Java规则引擎的工作机制及其核心算法—一Rete算法,并对一种
开源的Java规则引擎软件包——-Drools的API使用方法及其规则配置文件的结构及含义做了系统地研究分析。
本文着重阐述了一种基于Drools规则引擎的动态数据清洗系统的设计方案。
给出了领域知识规则和清洗动作规则的巴科斯范式定义,为规则的持久化存储提供了基础。
本文设计并实现了使用Drools规则引擎描述并执行清洗逻辑,能处理多种数据质量问题的动态数据清洗系统,弥补了现有数据清洗工具的不足。
这种动态性主要体现在规则的持久化存储和Drools规则配置文件的动态更新。
文中还详细介绍了系统的规则数据库设计、功能模块划分、架构和工作流程,给出了主要模块的部分
代码,并对系统做出了实验性能分析。
关键词:规则引擎,动态数据清洗,Drools,数据转换AbstractIncourseofoperationmanagement,companieshaveaccumulatedamassofvitalelectronicdata.Decision-makersbecomeincreasinglydependentontheabove—mentioneddatawhilecarryingthroughanalysisandstrategies弱wrongorconflictingdatawilllikelyresultinunsuccessfulmaneuver,whichinreturncanbreeddisastrousloss.Henceitisessentialthatdatashouldbeprocessedbeforeenteringint0decision—makingsysteminviewofimprovingitscredibilityandavailability.Toravelouttheabove-mentionedproblem,expertshaveputforwardasolutioncalleddatacleansingwhichreferstoinspecting”dirtydata”frommassivedataaccordingtocertainrule(domanialknowledge)andtorepairingordiscardingitinthelightofsomerule(cleansingactionrule).Traditionaltoolsfordatacleansinghavethefollowinginsufficiency:itisinefficientinpracticeinthatmodificationandrecompilationarcrequiredforthegenerationofcleansingsoftware,thereasonofwhichisthatlogicforinspectingandrepairing”dirtydata”isembeddedintocodeorreliesonagilebutinefficientmanualjudgment.ItisnootherthantheappearanceofJavaRuleEnginethatprovidefeasibletechnologicalfoundationforpeopletofindsuchadatacleansingmodethatbasedondynamicandconfigurablerules.ThethesispresentedthebasicprinciplesofRuleEngineandinvestigatedtheworkingmechanismofJavaRuleEngineanditscorealgorithmmRetealgorithm.Thethesisalsointroducedakindofopen-sourceJavaRuleEnginesoftwarepackagemDroolsandsystematicallyinvestigateditsAPIusage,thestructureandmeaningsofitsruleconfigurationfile.ThethesismainlyelaboratedonthedesignschemeofdynamicdatacleansingsystembasedonDroolsruleengineandinvestigatedtheBNF(Backus—NaurForm)definitionofdomanialknowledgeandcleansingruleslayingasolidfoundationforthepersistenceofrules.Thethesispresentedthedesignandimplementationofakindofdynamiccleansingsystem,whichadoptsDroolsRuleEnginetodescribeandexecutecleansingIlJo毋c卸dc柚dealwithmanykindsofproblemsrelatedtodataquality.ThissvstemreIned踟ethedefectthatexistingdatacleansingtoolshave.ThemainreasonsforachleVmgthlsalepersistentstorageofcleansingrulesanddynamicupdateofDr001smleconfigurationfile.Thethesisdetailedlypresentedruledatabasedesign.divisiDnoffunctlonalmodule,architecture,workingflowofthesystem,somecodesegIllentsofmainmodules??Thethesisalsopresentedtheresultofexperimentalperfb肋ancc’sanalysis.KeyWords:RuleEngine,DynamicDataCleansing,Drools,DataTI.ansfo咖ationIII独创性声明本人声明,所呈交的
论文是本人在导师指导下进行的研究工作及取得的研究成果。
尽我所知,除了文中特别加以标注和致谢的地方外,
论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得武汉理工大学或其它教育机构的学位或证书而使用过的材料。
与我一同工作的同志对本研究所做的任何贡献均已在
论文中作了明确的说明并表示了谢意。
关于
论文使用授权的说明本人完全了解武汉理工大学有关保留、使用学位
论文的规定,即学校有权保留、送交
论文的复印件,允许
论文被查阅和借阅;学校可以公布
论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存
论文。
(保密的
论文在解密后应遵守此规定)签名:妞翩签缸垄‰:迦墨:羔:f2武汉理一r大学硕士
论文1.1业务规则的含义第1章绪论业务规贝,lJ(BusinessRule)是对业务定义和约束的描述,用于维持业务结构或控制和影响业务的行为【1I。
业务规则技术的基本思想是将系统处理的业务逻辑从程序
代码中抽取出来,将其转变为简单的业务规则,以结构化的业务规则数据来表示业务行为,采用类自然语言来描述,并集中存储在规则库(以数据库或结构化的形式)中。
业务规则由业务人员创建、实时更新和调试,业务规则之间的复杂逻辑关系由规则引擎处理【2I。
业务规则技术改变了传统的、以过程形式处理业务逻辑的方式。
业务规则具有以下特性【3l:1)原子性,每条业务规则不可再分,且只定义一种判断和操作,复杂的业务逻辑由多条规则协同处理。
。
2)独立性,业务规则彼此之间独立,复杂的逻辑关系由规则引擎来处理。
业务规则存储在规则库中,独立于数据和程序。
3)简单性,业务规则用简单直接的类自然语言来描述,很容易被业务人员和技术人员所理解。
4)动态性,业务人员可以实时地修改业务规则,快捷地更新系统,低成本地维护系统。
5)逻辑性,业务规则至少包含条件和执行两个部分,条件是对业务数据作用的判定,执行是对业务数据的处理。
1.2规则引擎的发展和研究现状运营管理者对企业级IT系统的开发有如下的要求:尽管现代业务规则异常复杂,但为提高效率,管理流程必须自动化;市场要求业务规则经常变化,11r系统必须依据业务规则的变化快速、低成本的更新;为了快速、低成本的更新,业务人员应能直接管理IT系统中的规则,而不需要程序开发人员的参与。
这种情况下,项目开发人员就会碰到以下问题:有些复杂的商业规则很难推导出算武汉理工大学硕+
论文法和抽象出数据模型;软件工程要求从需求一设计一编码,然而业务规则常常在需求阶段可能还没有明确,在
设计和编码后还在变化,业务规则往往嵌在系统各处
代码中;对程序员来说,系统维护、更新困难,更不可能让业务人员来管理【4I。
随着商业以及市场的迅猛发展,业务逻辑的变化频率已经从以前的平均18个月缩短到平均6个月甚至更短,这意味着企业级应用的更新和升级变得越来越频繁。
同时又由于业务逻辑层没有标准的框架和统一的开发方式,使系统升级变的既昂贵又麻烦。
因此,迫切需要一个框架或统一的方法来开发业务逻辑层。
规则引擎的出现为开发人员解决上述问题提供了契机。
规则引擎是推理引擎的一种,起源于基于规则的专家系统(详见2.1.1)。
规则引擎能够将业务逻辑从应用
程序代码中分离出来,接受数据输入,解释业务规则,并根据规则做出业务决策。
规则引擎的核心内容是其所采用的匹配算法,早期的匹配算法主要是索引计数匹配法。
这种方法的匹配效率并不高,应用并不广泛。
在索引计数匹配算法的基础上,Forge于1979年提出了Rete算法。
Rete算法牺牲了一部分空间来提高算法的时间效率,使该算法有了广泛的应用空间。
目前,几乎所有成熟的规则引擎框架的实现都是基于该算法的。
但是,基于这些框架的企业级应用却并不多,原因是这些框架都有自己的实现方式,有自己的规则定义语言。
并且,绝大多数规则引擎框架都是商业产品,价格非常昂贵。
这种情况直到JSR94t51(Java规范要求,JavaSpecificationRequest)规则引擎标准和
开源规则引擎的出现才逐渐好转。
目前,满足JSR94标准并且比较成熟的规则引擎框架主要有JRules、JESS和Drools等。
其中,JRules是ILog公司的一个商业产品,价格很高;JESS是由美国Sandia国家实验室分布式系统计算组成员ErnestJ.FriedmanHill在1995年以应用广泛的CLIPS专家系统外壳为基础开发出来的,所采用的规则描述语言是类CLIPS描述语言,比较难懂,而且也是一个商业产品;Drools是一个
开源并且
免费的框架,采用XML或Drl格式的规则描述语言描述业务逻辑,是最近才逐渐成熟起来的一个框架,还需要进一步的完善161。
本文就是采用Drools规则引擎来描述并执行数据清洗逻辑。
2武汉理工大学硕士
论文1.3数据清洗的应用背景在构建业务数据库时,用户的录入错误、企业环境随时间推移的改变,都会影响所存放数据的质量。
数据质量问题可以分成:单数据源中的数据质量问题和多数据源中的数据质量问题。
单数据源和多数据源中的数据质量问题都还可以分成模式层和实例层的数据质量问题【似,91。
单数据源中的数据质量问题的实质是违背了约束(参照性约束,完整性约束及用户自定义约束),可以分为有不符合模式约束和记录约束两种,分别对应于记录质量问题和记录集质量问题。
记录质量问题主要有:字段值缺失、字段值不在值域范围内、单字段中包含多个字段值、字段值不符合业务规则约束、引用字段值缺失或错误。
可以在数据转换中发现和处理记录质量
问题。
记录集质量问题主要有:记录集中存在相似重复记录和记录集之间关联不符合关联约束条件。
记录集质量问题无法在转换过程中发现,需要在转换之前进行特殊的处理。
多数据源中的质量问题主要有:模式结构不一致、命名不一致,编码格式不一致,多数据源中存在冗余重叠记录。
多数据源中的质量问题是数据转换主要解决的问题,而不是数据清洗的目标。
数据清洗指的是在大量原始数据中使用一系列的逻辑规则和领域知识检测出“脏数据”并修复或丢弃之。
数据清洗一般是作为数据抽取、转换和加载(ETL’Extraction.Transformation.Loading)工具的一个功能来实现。
也存在大量数据清洗专用工具,它们被称为数据质量工具。
1.4数据清洗的研究现状数据清洗的相关研究最早可追溯到1959年【埘。
从那时起,汇总来自不同数据源的数据一直被认为是一个重要而困难的问题。
近年来,随着信息化的进展,人们开始系统地研究数据清洗问题。
主要成果可分类如下:1)特殊领域的数据清洗特殊域清洗工具主要解决某些特定领域的数据清洗问题,例如姓名和地址数据151。
这是目前研究得较多的领域,也是应用最成功的。
如商用系统:TriUinmSowtfare、PureIntegrate(Oracle)、QuickAddress(QASSystems)等。
它们用一个匹配工具抽取被清洗的数据,并把姓名和地址信息转换成单个标准元素、有效的3武汉理工大学硕士
论文街道名、城市和邮政编码。
它们具体表现为使用一个大的预定义规则库来处理在清洗过程中发现的问题。
2)与领域无关的数据清洗与领域无关的数据清洗研究主要集中在清洗重复的记录上【111,其主要工具包括:DataBladeModule,ChoiceMaker,Integrity,Megre/PugreLibrary(Sagent/QMSotfware),MatchIT(HelpITSystems),MasterMegre(PitneyBowes),DataCleanser(EDD)等。
3)数据抽取、转换和加载但TL’Extraction.Transformation.Loading)-I-具中的数据清洗数据抽取、转换和加载是数据仓库
系统中数据处理的关键操作。
ETL就是根据数据处理的需要,将源数据对象经过转换后加载到目标数据对象中【12】。
很多商业工具在多方面支持数据仓库的ETL过程,如Ardent的DataStage、Microsoft的DataTransformationService、SAS的WarehouseAdministrator和Informatica的PowerMart等。
这些工具在关系数据库系统上建立一个存储器,以统一的方式管理关于数据源、目标模式、映射、脚本程序等所有元数据。
通过文件、关系数据系统、以及标准接口(如JDBC、ODBC等),从数据源中抽取模式和数据。
并提供图形化的界面来定义数据转换逻辑规则。
这些ETL工具提供了大量数据的抽取、转换和加载操作,但只对数据清洗提供有限支持。
ETL工具并不是完全针对数据清洗而设计的。
传统的数据清洗
软件采用的策略有:1)将检测“脏数据”和进行修复操作的逻辑嵌入到系统各处的程序
代码中;2)让用户进行灵活但低效的手工判断。
前者当“脏数据”的定义发生变化时,需要重新编译数据清洗软件,这在实际使用中是不可行的;后者则不能保证人工判断的完整性和准确性171。
文献〔12〕为本文指出了一个可能的方向。
该文提出了数据清洗规则的概念,给出了基于规则的数据清洗思路。
本文的研究课题就是在上述背景下提出的,采取的方法是将一种
开源的Java规则引擎——-Drools应用于数据清洗,以此实现清洗规则的动态配置和及时更新,从而提高了数据清洗系统的可复用性、准确性和可扩展性。
4武汉理工大学硕士
论文1.5本文主要研究内容1)研究分析了规则引擎的基本原理;2)研究分析了Java规则引擎的工作机制;3)研究分析了Java规则引擎的核心算法_Rete算法;4)研究分析了一种
开源的Java规则引擎软件包-Dr00ls,并系统地研究分析了其API的使用方法和规则配置文件的结构和含义;5)研究分析了数据质量和数据清洗的相关问题;6)研究分析了领域知识和清洗动作规则的巴科斯范式(BNF,Backus.NaurForm)定义,阐述了一种基于Drools规则引擎的动态数据清洗系统的设计
方案;7)详细介绍了基于Drools规则引擎的动态数据清洗系统的规则数据库设计、系统功能模块划分、系统结构和工作流程,并给出了主要模块的部分
代码和系统实验性能分析结果。
1.6本文的组织形式本文的主要内容有5章,第1章是绪论,主要分析了本课题的研究背景,同时综述了数据清洗技术的研究现状及本文所做的主要工作。
第2章分析了基于规则的专家系统的原理,Java规则引擎的工作机制和Rete算法的原理。
对一种
开源Java规则引擎——Drools的API的使用进行了系统分析和介绍,并结合实例分析了其规则配置文件的结构及含义。
第3章详细介绍了“脏数据”的概念及数据质量的概念及分类,并详细介绍了数据清洗的概念、模型和流程。
第4章阐述了基于Drools规则引擎的动态数据清洗系统的设计方案。
首先给出了系统使用的两种规则。
接着详细介绍了系统的详细设计。
第5章对全文进行了总结,并对系统需要进一步所做的工作进行了展望。
5武汉理工大学硕士
论文第2章Java规则引擎的研究2.1规则引擎的原理规则引擎是基于规则专家系统(RBES,Rule-BasedExpertsystem)的重要组成部分。
下面先简要地介绍一下RBES,以便深入地了解Java规则引擎。
2.1.1基于规则的专家系统简介RBES由三部分组成:规则库/知识库(RuleBase/KnowledgeBase)、-I-作内存/事实库(WorkingMemory/FactBase)和推理引擎(InferenceEngine)。
它们之间的关系如图2-1所示。
图2-1基于规则的专家系统构成规则(知识)库是中心数据库,存储着各种模拟人类问题求解的产生式规则。
每一条规则分为两部分:前件部分和后件部分。
前件(Antecedent)3L称条件部分、模式部分或左部(Left.Hand.Side,LHS),是规则触发的条件。
单独的一个条件称为条件元素或一个模式;后件(Consequent)又称右部(Right.Hand.Side,RHS),是规则触发时将要执行的一系列动作。
工作内存是应用于规则(知识)库的全局数据库,它保存系统的当前状态。
推理引擎通过决定哪些规则满足工作内存中的事实或目标,而授予规则优先级,并将满足事实或目标的规则加入议程安排器【131。
如图2-1所示,推理引擎6武汉理工大学硕+
论文又可分成三部分:模式匹配器、议程安排器和执行引擎。
模式匹配器通过比较事实和规则的模式部分,决定选择执行哪个规则,何时执行规则。
它是基于规则的推理引擎的关键,并决定了推理引擎的推理效率;议程安排器是由推理引擎创建的一个规则优先级表,这些规则都匹配工作内存中的事实。
如果同时有多个规则和事实匹配,则优先级最高的先被触发。
被触发规则的动作可能会产生新的事实,这些新的事实也会被加入工作内存;执行引擎负责执行议程安排器中的规则和其他动作。
.和人类的思维类似,推理引擎存在两种推理方式:演绎法(Forward.Chaining)和归纳法(Backward.Chaining)。
演绎法从一个初始的事实出发,不断地应用规则得出结论或执行指定的动作。
而归纳法则是根据假设,不断地寻找符合假设的事实。
Rete算法是目前效率最高的一个演绎法推理算法,许多Java规则引擎都是基于Rete算法来进行推理计算的。
推理引擎的推理步骤如下:1)将初始事实数据载入
工作内存;2)使用模式匹配器比较规则库中的规则和工作内存中的事实数据;3)如果执行规则时存在冲突(Conflict),即同时激活了多个规则,则将冲突的规则放入冲突集合;4)解决冲突,将激活的规则按顺序放入议程安排器;5)使用执行引擎执行议程安排器中的规则;6)重复步骤2)至5),直到议程安排器中的所有规则被执行完毕。
Java规则引擎就是从这一规则引擎的原始架构演变而来【14I。
2.1.2Java规则引擎的工作机制Java规则引擎检索提交到引擎的数据对象,根据这些对象的当前属性值和它们之间的关系,从加载到引擎的规则库中发现符合条件的规则,创建这些规则的执行实例【151。
这些实例将在引擎接到执行指令时依照某种优先顺序依次执行。
一般来讲,Java规则引擎内部由如下几部分构成:工作内存(WorkingMemory)或工作区,用于存放被引擎引用的数据对象集合;规则执行队列,用于存放被激活的规则执行实例;静态规则区,用于存放所有被加载的业务规则,这些规则将按照某种数据结构组织。
当工作区中的数据发生改变后,引擎需要迅速根7武汉理工大学硕士
论文据工作区中的对象状态,调整规则执行队列中的规则执行实例。
Java规则引擎工作机制的示意图如图2.2所示。
、.。
Java)立用程序规则引擎对象/==\幻工怄、¨办/、、........J/,U引用对象/\Q,■\//∑(对象y/1.f\/,规则库、、.........J/静态规则区/厂\/规则1规则设定1七规则2规则设定2规则n规则设定n1|。
上规则执行队列\/\图2-2Java规则引擎工作机制1141当引擎执行时,会根据规则执行队列中的优先级顺序逐条执行规则执行实例,由于规则的执行部分可能会改变工作区的数据对象,从而会使队列中的某些规则执行实例因为条件改变而失效,必须从队列中撤销,也可能会激活原来不满足条件的规则,生成新的规则执行实例进入队列。
于是就产生了一种动态的规则执行链,形成规则的推理机制。
这种规则的“链式”反应完全是由工作区中的数据驱动的。
任何一个规则引擎都需要很好地解决规则的推理机制和规则条件匹配的效率问题。
规则条件匹配的效率决定了引擎的性能,引擎需要迅速测试工作区中的数据对象,从加载的规则集中发现符合条件的规则,生成规则执行实例,最武汉理:1=大学硕士
论文后输出匹配结果【161。
1979年,美国卡耐基??梅隆大学的CharlesL.Forgy博士在其博士
论文【17I中首次提出了一种叫做Rete的算法,很好地解决了这方面的问题。
目前世界顶尖的商用规则引擎产品基本上都使用Rete算法。
2.2Rete算法研究”Rete”是拉丁语,相当于英语中的”Net”,是网络的意思。
Rete算法可以分为两部分:规则编译(RuleCompilation)和运行时执行(RuntimeExecution)。
编译算法描述了产生式内存区或静态规则区(ProductionMemory)qb的规则如何产生一个有效的辨别网络(DiscriminationNetwork)。
辨别网络通过数据在网络的传播过程中来过滤数据。
在辨别网络的顶端将会有很多匹配的数据。
当顺着
网络向下走,匹配的数据将会越来越少。
在网络的最底部是终端节点(TerminalNode)。
在Dr.Forgy的
论文【17】中,描述了4种基本节点:根节点(RootNode),单输入结点(1.InputNode),双输入结点(2一InputNode)_;}n终端结点(TerminalNode)。
如图2.3所示,在Drools规则引擎的辨别网络中定义了8种节点类型:对象类型结点(ObjectTypeNode),阿尔法结点(AlphaNode),左输入适配器结点(LeftlnputAdapterNode),求值结点(EvalNode),根节点(ReteNode),联接结点(JomNode),存在结点(NotNode)和终端结点(TerminalNode)。
下面的描述均使用图2.3中的图例来表示各种结点。
对象类型结点(二)根结点阿尔法结点\二二7联接结点左输入适配器结点求值结点◇广—〕’--....................一/存在结点终端结点图2-3Drools引擎中定义的8种节点类型根节点是所有的对象进入网络的入口。
然后,从根节点立即进入到对象类型结点,其作用是使引擎只做它需要做的事情。
例如,有两个对象集:帐户类9口ooO武汉理工大学硕士
论文(Account)和订单类(Order)。
如果规则引擎需要对每个对象都进行一个周期的评估,那会浪费很多的时间。
为了提高效率,引擎将只让匹配对象类型的对象到达节点。
通过这种方法,如果某个应用声明一个新的帐户类对象,它不会被传递到订单类对象类型节点中。
很多现代Rete算法实现都有专门的对象类型结点。
其中一些对象类型结点被用散列法进行了优化。
图2.4说明了这一过程。
根结点单图2.4根结点向对象类型结点的传递对象类型结点能够传播到阿尔法结点(对应单输入结点),左输入适配器结点和双输入结点(对应联接结点和存在结点)。
阿尔法结点被用来评估字面条件(LiteralConditions)。
尽管在Dr.Forgy的
论文里只提到了相等条件(字面相等),很多Rete实现还支持其他的操作。
例如,Account.name==”ZhangShan”是一个字面条件。
当一条规则对于一种对象类型结点有多条字面条件时,这些字面条件将被链接在一起。
就是说,如果一个应用声明一个Account类对象,在它能到达下一个阿尔法结点之前,它必须先满足上一个字面条件。
图2.5说明了Account类的阿尔法结点组合:name==”ZhangShan”,Id==”123456789”。
Name=”ZhangShan”图2-5阿尔法结点的组合使用10~甲定武汉理工大学硕士
论文Drools通过散列法优化了从对象类型结点到阿尔法结点的传播。
当一个阿尔法结点被加到一个对象类型结点的时候,就以字面值(LiteralValue)作为键,以阿尔法结点作为值加入哈希表(HashMap)。
当一个新的类实例进入对象类型结点的时候,不用传递到每一个阿尔法结点,可以直接从哈希表中获得正确的阿尔法结点,避免了不必要的字面检查。
双输入节点对应于Drools中的两种结点:联接结点和存在结点(共同被称为贝塔结点——BetaNodes)。
双输入节点被用来比较两个对象及其属性。
这两个对象可以是同种类型,也可以是不同类型。
双输入节点的两个输入称为左边输入(Left)和右边输/X.(Righ0。
左边输入通常是一列对象(Alistofobjects)。
在Drools中,这是一个数组。
右边输入是单一对象。
两个存在结点可以完成存在性检查。
Drools将索引应用在双输入节点上,从而扩展了Rete算法。
图2-6说明了一个联接结点的使用。
SubjectStudentStudent.favoriteSubject=Subject.name图2-6联接结点的使用图中的左边输入用到了一个左输入适配器结点,它的作用是将一个单一对象转化为一个单对象数组(SingleObjectArray),再传播到联接节点。
因为上面提到过左边输入通常是-YU对象(Alistofobjects)。
终端结点被用来表明一条规则已经匹配了它的所有条件(Conditions)。
在这点,这条规则有了一个完全匹配(FullMatch)。
在一些情况下,一条带有“或”条件的规则可以有超过一个的终端结点。
Drools引擎通过节点的共享来提高规则引擎的性能。
因为很多的规则可能武汉理工大学硕士
论文存在部分相同的模式,节点的共享可以对内存中的节点数量进行
压缩,以提供遍历节点的过程。
下面的两个规则就共享了部分节点。
Rulel:whenSubject(¥subject:name==”Computer”)¥student:Student(favouriteSubject==Ssubject)thenSystem.out.println(¥person.getName0+”likes”+¥subject.getName0);endRule2:whenSubject(Ssubject:name==”Computer”)¥student:Student(favouriteSubject!=Ssubject)thenSystem.out.println(¥student.getName0+”doesnotlike”+¥subject.getName0);end这两条规则的中的左边(LHS,Left-Head??Side)基本是一样的,只是最后的favouriteSubject,一条规则是等于¥subject,而另一条规则是不等于¥subject。
图2.7是这两条规则的节点共享示意图。
12武汉理工大学硕士
论文SubjectbjeclSystem.out.println(Student.getNameO+”doesnotlike”+subject.getNameO);图2.7规则节点的共享从图2.7可以看到,编译后的Rete网络中,阿尔法结点是共享的,而双输入结点不是共享的。
这两条规则都有各自的终端结点。
Rete算法的第二个部分是运行时执行(RuntimeExecution)。
当某个应用声明一个对象后,Drools引擎将数据传递到根结点。
然后它进入对象类型结点并沿着网络向下传播。
当数据匹配一个节点的条件,节点就将它记录到相应的内存中。
这样做的主要原因是可以带来更快的性能。
虽然记住完全或部分匹配的对象需要大量的内存,但这使它具有速度快和可伸缩的优点。
当一条规则的所有条件都满足,这就是完全匹配。
而只有部分条件满足,就是部分匹配。
13武汉理工大学硕士
论文2.3Drools规则引擎研究Drools是一款成功的
开源Java规则引擎项目,它采用了高效的模式匹配算法一—-Rete算法,实现了逻辑与数据的分离,采用的语言是当前流行的面向对象语言——Javao.2.3.1Drools规则引擎APl分析Drools分为两个主要部分:构建(Authoring)时组件和运行时(Runtime)组件。
构建的过程涉及到.drl或.xml规则文件的创建,它们被读入一个解析器,使用ANn尽3(即语言识别的另一个工具,ANotherToolforLanguageRecognition)语法进行解析。
解析器对语法进行正确性的检查,然后产生一种中问结构.t??descr”,”descr”用AST来描述规则。
AST然后被传到PackageBuilder类,由PackagBuilder类来产生Package对象。
PackageBuilder类还承担着一些
代码产生和编译的工作,这对于产生Package对象都是必需的。
Package对象是一个可以配置的,可序列化的,由一个或多个规则组成的对象。
图2-8说明了它们之间的相互关系。
图2-8Drools规则引擎的构建时组件RuleBase是一个运行时组件,它包含了一个或多个Package对象。
可以在任何时刻将一个Package对象加入或移出RuleBase对象。
一个RuleBase对象可以在任意时刻实例化一个或多个WorkingMemory对象,在它的内部保持对这些Working;Memory的弱引用。
WorkingMemory由一系列子组件组成。
当应用程序中的对象被声B)l(assea)进WorkingMemory,可能会导致一个或多个激活(Activation)的产生,然后由Agenda负责安排这些激活的执行。
图2-9说明了它14武汉理工大学硕七
论文们的相互关系。
图2-9Drools规则引擎的运行时组件主要有三个类用来完成规则的构建过程:DrlParser,XmlParser和PackageBuilder。
前两个解析器类(DrlParser类和XmlParser类)从传入的Reader类实例产生descrAST模型。
下面将详细分析Drools规则引擎主要类(接口)的使用。
1.PackageBuilder类提供了简便的API,使得可以忽略DrlParser和XmlParser这两个解析器类的存在。
这两个简单的方法是:”addPackageFromDrl0”和”addPackageFromXml0”,两个方法都只要传入一个Reader类的实例作为参数。
下面的例子说明了如何从类路径(ClassPath)下的xml或drl文件创建一个Package对象。
所有传入同一个PackageBuilder实例的规则源,都必须是在相同的包(package)命名空间中。
下面的
代码段
演示了如何从指定的类路径下读取规则配置文件,并生成一个Package对象:PackageBuilderbuilder=newPackageBuilder0;builder.addPackageFromDrl(newlnputStreamReader(getClass0.getResourceAsStream(”packagel.drl””);builder.addPackageFromXml(newInputStreamReader(getClass0.getResourceAsStream(”package2.drl”)));Packagepkg=builder.getPackage0;PackageBuilder类的使用如图2.10所示。
15武汉理工大学.