欢迎来到天天文库
浏览记录
ID:4096875
大小:939.00 KB
页数:48页
时间:2017-11-28
《drools研究 drools学习》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Drools的进一步研究——徐建军2006-09-241.概述12.规则表示22.1.Package22.2.Rule42.2.1.规则属性52.2.2.LHS62.2.3.RHS82.3.Query92.4.DSL102.5.XML112.6.决策表133.规则编译154.Rete算法184.1.Rete网络的构成184.2.基于Rete网络的前向推理过程245.Leaps算法245.1.Leaps推理机的构造过程265.2.事实对象的操作过程315.2.1.事实对象的断言过程315.2.2.事实对象的收回过程325.2.3.事实对
2、象的修改过程335.3.基于Leaps推理机的前向推理过程335.4.Droosl3的Leaps算法的说明376.RuleBase387.WoringMemory398.Agenda439.Drools的下一步发展4510.结论461.概述在介绍规则系统的文章中,经常提到的一句话是:任何事物都会改变,唯一不变的是变化。Drools同样也不例外。目前Drools已经从Codehaus中独立出来,转投JBoss这座靠山,目前最新发布版本是3.0.4。目前名称叫JBossRules,但为了描述方便,这里仍称为Drools。Drools3与前
3、面分析的2.5版本比较在很多方面都发生了改变。图1描述了目前Drools规则引擎的构成。图1Drools规则引擎的构成从图上可以发现最显著的变化是引擎的模式匹配(PatternMatcher)算法除了实现了Rete算法,还实现了Leaps算法。但是其它模块在具体细节上也有改变或者改进。本文主要针对Drools2.5版本,介绍Drools3新的实现方法和机制。并且只对这些变化较大的部分进行介绍,而忽略了相同的或者有细微改变但实现原理相通的地方。理解不清的部分可以参照以前的分析文档。本文首先介绍了Drools3中一个主要变化:Drools
4、独立的规则定义语言,其中还包括DSl和决策表。然后介绍Drools3的规则编译过程。重点分析Drools3中的两种推理算法——Rete算法和Leaps算法,对于Rete算法只介绍了Drools3和Drools2.5实现的不同之处,由于Leaps算法是Drools3新引进的算法,所以对它进行了详细分析。最后分几小节介绍Drools3在RuleBase、WorkingMemory和Agenda三个部分所进行的主要改进,最后给出结论。1.规则表示Drools3与Drools2.5相比较,很重要的改变就是规则的表示从XML格式转变为文本格式,
5、使用了一套自己的规则描述语言。这种语言的格式非常简单易懂,便于规则的创建和维护,而且可以通过DSL(DomainSpecificLanguages)的形式进行扩展。规则定义文件仍然以“drl”为后缀,同时Drools3仍然支持XML格式的规则定义方式。为了方便对业务规则的定义、维护和分析,Drools3还实现了决策表功能。1.1.Packagepackage表示一系列规则的集合,是定义和管理规则的基本单位,对应到Drools2.5中的RuleSet。与Java的package不同,这里package的名称只有名字空间的作用,与文件和目
6、录结构无关。package的主要内容由import、expander、global、function、query和rule部分构成。结构见图2。下面主要介绍import、expander、global和function四个部分,query和rule在后续小节中介绍。图2package的语法结构这里的import语句与Java中的import语句功能相同。把规则需要引用的Java对象类名德全路径写在“import”之后,规则引擎运行时会自动装载相应类。示例如下:importorg.drools.examples.FibonacciExa
7、mple.Fibonacci;expander语句用于表示扩展规则定义所需的DSL文件,这些DSL文件解释了规则体中针对特定问题领域的方便用户理解的组成元素。示例如下:expanderticketing.dsl;global语句表示多个规则用到的全局变量,常用于表示规则使用的数据,对应于Drools2.5中的application-data属性。如果多个包同时定义同一名称的全局变量,那这些变量必须是同一类型,实际执行时它们都指向同一变量。由于全局变量并不会断言到WorkingMemory中,引擎并不知道变量值是否发生了改变,所以全局变
8、量一般不能用在规则的条件限制语句(constraints)中,除非明确知道global变量值不会发生改变。示例如下:globaljava.lang.Integeri;function表达式用于定义规则体经常使用的业务逻辑
此文档下载收益归作者所有