1、Drools入门手册1高尔夫球员的位置?已经知道有四个高尔夫球员,他们的名字是Fred,Joe,Bob,Tom;今天他们分别穿着红色,蓝色,橙色以及格子衣服。并按照从左往右的顺序站成一排。我们将最左边的位置定位1,最右边的位置定为4,中间依次是2,3位置。现在我们已经了解的情况是:1)高尔夫球员Fred,目前不知道他的位置和衣服颜色 2)Fred紧挨的右边球员穿蓝色的衣服 3)Joe排在第2个位置 4)Bob穿着格子短裤 5)Tom没有排在第1位或第4位,也没有穿橙色衣服 现在要求你根据上述条件获得四个球员分别的位置和穿着。如果要求使用编程方式获得结果,这显然是一个很有挑战性的工作,你可以思考
2、一下。而使用规则引擎的方式来思考问题,我们其实是要从各种可能的排列中将需要的结果挑出来 因此我们只需要将球员所有可能的排列组合(位置及颜色)出来,放入Working Memory中 然后让规则引擎帮我们挑出来就可以了。If(.).else咱们习惯看程序!2引出话题-drools人工智能人工智能人工智能(人工智能(Artificial Intelligence,简称称AI)是)是计算机学科的一个分支,二十世算机学科的一个分支,二十世纪七十年代以来被称七十年代以来被称为世界三大尖端技世界三大尖端技术之一(空之一(空间技技术、能源技、能源技术、人、人工智能)。人工智能是研究使工智能)。人工智能是研究
3、使计算机来模算机来模拟人的某些人的某些思思维过程和智能行程和智能行为(如学(如学习、推理、思考、推理、思考、规划等划等)的学科。)的学科。专家系家系统所所谓“专家家”,一般都,一般都拥有某一特定有某一特定领域的大量域的大量知知识,以及丰富的,以及丰富的经验。在解决。在解决问题时,专家家们通常通常拥有一套独特的思有一套独特的思维方式,能方式,能较圆满地地解决一解决一类困困难问题,或向用,或向用户提出一些建提出一些建设性性的建的建议等。等。什么是什么是专家系家系统呢?呢?简单地地讲,专家系家系统就是就是一个具有智能特点的一个具有智能特点的计算机程序,它的智能化算机程序,它的智能化主要表主要表现为能
4、能够在特定的在特定的领域内模仿人域内模仿人类专家家思思维来求解复来求解复杂问题。因此,。因此,专家系家系统必必须包包含含领域域专家的大量知家的大量知识,拥有有类似人似人类专家思家思维的推理能力,并能用的推理能力,并能用这些知些知识来解决来解决实际问题。例如,一个医学。例如,一个医学专家系家系统就能就能够像真正的像真正的专家一家一样,诊断病人的疾病,判断病人的疾病,判别出病情的出病情的严重性,并重性,并给出相出相应的的处方和治方和治疗建建议等等。等等。例例如个人理如个人理财专家系家系统、寻找油田的找油田的专家系家系统、贷款款损失失评估估专家系家系统、各、各类教学教学专家系家系统等。等。基于基于规
5、引擎的引擎的专家系家系统Java规则引擎-drools 3基于基于规则的的专家系家系统构成构成知识事实推理引擎演演绎法:法:从一个初始的事实出发,不断地应用规则得出结论(或执行指定的动作)。归纳法:法:则是根据假设,不断地寻找符合假设的事实。Rete算法 以后版本4基于基于规则的的专家系家系统构成构成(1)初始化事)初始化事实(2)比)比较规则与事与事实Pattern Matcher:样品匹配(3)冲突的)冲突的规则放入冲突集合放入冲突集合(4)解决冲突,将)解决冲突,将激活的激活的规则按按顺序放序放入入Agenda。(5)执行行Agenda中的中的规则5规则引擎相关构件引擎相关构件 信息元(
6、Information Unit)信息服务(Information Services)队列管理器规则集(Queue Manager Rule Set)队列管理器(Queue Manager)6处理过程分为四个阶段进行 7规则引擎工作机制引擎工作机制 8Java规则引擎工作机制 9Java规则引擎引擎APIJSR-941Java规则引擎引擎API体系体系结构构业务规则引擎架构引擎架构10Java规则引擎引擎APIJSR-94规则引擎API将管理API和运行时API加以分开,从而为这些包提供了较好粒度的安全控制.规则引擎API并没有提供明显的安全机制,它可以和J2EE规范中定义的标准安全API联合
7、使用.安全可以由以下机制提供,如Java authentication and authorization service(JAAS),the Java cryptography extension(JCE),Java secure Socket Extension(JSSE),或者其它定制的安全API.JAAS能被用来定义规则执行集的许可权限,从而只有授权用户才能访问。2Java规则引擎引擎API安全安全问题 11Java规则引擎引擎APIJSR-943异常与日志异常与日志 规则引擎API定义了javax.rules.RuleException作为规则引擎异常层次的根类.所有其它异常都继承于
8、这个根类.规则引擎中定义的异常都是受控制的异常(checked exceptions),所以捕获异常的任务就交给了规则引擎。规则引擎API没有提供明确的日志机制,但是它建议将Java Logging API用于规则引擎API。12规则语言 13规则语言言规则文件通常是以drl扩展名结尾规则的规则文件的完整结构 package package-name imports globals functions Queries rules规则文件14规则语言言规则具有如下主体结构:rulename attributes when LHSthen RHS end两边的引号也是可选的 ATTRIBUTES(
9、通常是可选项)指出规则的行为表现 LHS是规则的条件部分 RHS是允许Java语义代码 规则构成 15规则语言言尽力避免使用的:rulequerywhenthenendnullandornotexistscollect accumulatefromforalltruefalseeval避免使用 packagefunctionglobalimporttemplate attributesenabledsaliencedurationinitactionreverseresultcontainsexcludesmemberOfmatchesin date-effectivedate-expires
10、no-loop auto-focusactivation-groupagenda-groupdialectrule-flow-group规则保留字 16规则语言言单行注释#this is a single line comment /this is also a single line comment多行注释 /*this is a multi-line comment */注释17规则语言言Package 18Import 标记就像java中的含义一样。对于任何要用在规则中的对象,你需要指定完整的路径和类型名。Drools从同名的java包中自动导入类。expander Expander标记
11、是可选的,用来指定DSL配置(通常保存在独立文件中)。这为解析器提供了如何理解你自定义的规则语言。API允许用编程方式附加DSL模板,如果expander没有声明在源文件中。规则语言言19Global不会插入到Working Memory中,因此当全局变量发生改变时,引擎不会得知;因为这个原因,全局变量不能用在条件约束上,除非这个值不会发生改变。在条件约束中错误使用全局变量会导致意想不到的结果。引擎不会通知和跟踪全局变量的值变更。不正确的在约束中使用全局变量会带来让人惊讶的结果糟糕的惊讶,就像医生对你的X光片说“那里有些有趣的东西”一样。如果多个Package声明了同样的全局变量,那么它们必须
12、有相同的类型,并指向同一个全局变量。规则语言言global全局变量 为了使用全局变量,你必须 在规则文件中声明全局变量并使用它 global java.util.List myGlobalList;rule Using a globalwhen eval(true)then myGlobalList.add(Hello World);end在working memory上设置全局变量的值。最好是在将fact插入working memory之前设置完所有全局变量 List list=new ArrayList();WorkingMemory wm=rulebase.newStatefulSess
13、ion();wm.setGlobal(myGlobalList,list);20规则语言言Function 函数最大的用处是被规则的推论(then)部分中的行为所调用,特别是当一个行为操作需要反复被调用时如发送邮件。典型的函数声明如下所示:function String hello(String name)return Hello+name+!;Drools4.0支持静态方法导入 import static my.package.Foo.hellorule using a static functionwhen eval(true)then System.out.println(hello(B
14、ob);end21规则语言言Rule LHS:规则指定“when”作为一系列条件的集合 RHS:指定一系列操作 规则不能进行嵌套 规则语法法 rule *when *then *end规则示例示例rule Approve if not rejected salience-100 agenda-group approval when not Rejection()p:Policy(approved=false,policyState:status)exists Driver(age 25)Process(status=policyState)then log(APPROVED:due to no
15、 objections.);p.setApproved(true);end 22规则语言言Rule 属性 要从要从Drools中中获得最大的收得最大的收获,你必,你必须十分的了解每一个属性。十分的了解每一个属性。23N/A是指表格中空出的地方要填的一是指表格中空出的地方要填的一栏,与你的情况不合。例如:有的表格,与你的情况不合。例如:有的表格问你有几个孩子,你你有几个孩子,你连结婚都没有婚都没有结,自然填,自然填N/A。注释关关键字字默默认值 类型型描述描述no-loop false Boolean 当规则在推论中对fact进行修改后,可能会导致该规则的重新激活,引起递归。设置no-loop为
16、true可以阻止该规则被再次激活。salience 0integer 每一个规则有一个整数类型的优先级属性,默认为0,这个整数可以使正负数。优先级数字高的规则会比优先级低的规则先执行。agenda-group MAIN String Agenda group允许用户对分隔Agenda执行区提供更多的控制。只有在具有焦点的agenda group中的规则才能够激发。auto-focusfalse Boolean 自自动获取焦点取焦点。当规则的auto-focus属性为true时,如果该规则符合激活条件,则该规则所在agenda-group自动获得焦点,允许规则激发。activation-grou
17、p N/A String 在同名activation-group中的规则将以互斥的方式激发。这个意思时在这个组中第一条被激发的规则将取消其它规则的激发,即使它们已经在激发队列中。Activation-group属性可以是任何字符,只要所有你需要放在同一个组中的规则中的activation-group属性是相同的即可。注:这个组之前被称为Xor-group,但是从技术上来说它与Xor并不完全一样,但是当你听到别人说xor-group时,你知道这就是activation-group。dialect 由Package指定默认值 可能值:java or mvelString Dialect指定在LHS
18、代码表达式或RHS代码块中使用的语言。当前两种语言有效,Java和MVEL。Dialect可以在Package级别统一指定,而Rule属性中指定的dialect将局部覆盖掉Package中的定义。date-effective N/A String 包含日期/时间定义 规则只能在date-effective指定的日期和时间之后激活。date-exptires N/A String,包含日期/时间定义 如果当前时间在date-expires指定的时间之后,规则不能激活。duration N/A long Duration指出规则将在指定的一段时间后激发,如果那个时候规则的激活条件还是处于true的
19、情况下。24规则语言言LHS(when)条件元素 LHS是空的,那它被重写为eval(true)rule no CEswhenthen *endrule no CEswhen eval(true)eval(true)then *end25规则语言言LHS(when)条件元素 模式模式实体关系体关系图26规则语言言LHS(when)条件元素 Compound:复合的Restriction:限制,约束Constraint:约束,强制Pattern:模范,式样,模式,样品27字段约束分为单值约束,复合值约束和多重约束 规则语言言LHS(when)条件元素 Field Constraints 字段字段
20、约束束 28规则语言言LHS(when)条件元素 单值约束束 操作符:操作符:正正则表达式表达式约束:字段匹配(束:字段匹配(Matches)用于任何有效的)用于任何有效的Java正正则表达式。表达式。Cheese(type matches(Buffalo)?S*Mozerella)Cheese(type not matches“(Buffulo)?S*Mozerella”)contains 用来用来检查是否字段的集合或数是否字段的集合或数组包含指定的包含指定的对象。象。CheeseCounter(cheeses contains stilton)/contains with a String
21、 literalCheeseCounter(cheeses contains$var)/contains with a variablenot containts用来用来检查是否字段的集合或数是否字段的集合或数组不包含指定的不包含指定的对象。象。CheeseCounter(cheeses not contains cheddar)/not contains with a String literalCheeseCounter(cheeses not contains$var)/not contains with a variable注意:为向后兼容性,excludes作为not contain
22、s的一个同义字提供。29memberof 用来用来检查字段是否是集合或数字段是否是集合或数组的成的成员;集合必;集合必须是是绑定的定的变量。量。CheeseCounter(cheese memberof$matureCheeses)not memberof用来用来检查字段是否不是集合或数字段是否不是集合或数组的成的成员;集合必;集合必须是是绑定定的的变量。量。CheeseCounter(cheese not memberof$matureCheeses)字符串字符串约束束 字符串字符串约束是最束是最简单的的约束格式,将字段与指定的字符串求束格式,将字段与指定的字符串求值:数:数值,日期,日期,
23、string或者或者boolean。Cheese(quantity=5)/数数值Cheese(bestBefore 30&30&20&30&30)End规则定定义文件文件QueryResults results=workingMemory.getQueryResults(people over the age of 30);System.out.println(we have +results.size()+people over the age of 30);System.out.println(These people are are over 30:);for(Iterator it=results.iterator;it.hasNext();)QueryResult result=(QueryResult)it.next();Person person=(Person)result.get(person);System.out.println(person.getName()+n);JAVA调用代用代码40设置置规则所属的所属的规则流流组 rule YourRule ruleflow-group group1 when .then .end 规则流流规则流 41规则语言言规则流流使用eclipse新建规则流42
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100