drools使用手册第三章内容摘要:

,默认就是 and。 注意在‘ and’前面不能有一个如‘ or’这样的声明绑定,想一下你很容易明白。 一个声明只能涉及到一个单独的 Fact, 当 and被满足时,它匹配超过一个 fact,哪一个 Fact 是声明所绑定的呢。 [译者注:这里的翻译有些难懂,估计的意思是如果将 and和 or平级混用,这将引起逻辑上的混乱,因此不能这样。 ] . 39。 and39。 图 . and 有效的子条件元素 (用括号进行组合 ): and, or, not, exists, column 例 . Column Cheese( cheeseType : type ) amp。 amp。 Person( favouriteCheese == cheeseType ) Cheese( cheeseType : type ) and Person( favouriteCheese == cheeseType ) . 39。 or39。 图 . or 有效的子条件元素 : and, or, not, exists, column 例 . or Person( sex == f, age 60 ) || Person( sex == m, age 65 ) Person( sex == f, age 60 ) or Person( sex == m, age 65 ) 图 . or 例 . or with binding pensioner : ( Person( sex == f, age 60 ) or Person( sex == m, age 65 ) ) Or条件元素在多个规则(称为子规则)中对每一个可能的逻辑输出产生结果。 上面的示例将在两个规则中产生结果。 这两个规则在 Working Memory 中独立的工作,这意味着每一个都能够匹配、激活和执行,没有捷径。 OR的最好的使用方式是作为产生两个额外规则的捷径。 如果你这样想,很明显对于一个规则能有多个行为,如果 Or 条件元素的两边都满足的话。 . 39。 eval39。 图 . eval 有效的子条件元素 : none Eval 本质上是一个允许任何语义代码(代码返回原型 boolean)被执行的调用。 它可以用来查阅在规则的 LHS 中绑定的变量。 在一个规则的 LHS 中, eval 必须被放在最后。 你可以在规则中有多个 evanl ,通常你需 要使用一些列约束将他们组合起来。 Eval 不能被索引,这不是使用值约束的最佳方式。 但是当函数的返回值不断改变时(这样的函数不能用在值约束中),使用 eval 非常合适。 如果规则中的其它条件是匹配的, eval 仍然需要每次都重新检查。 对于那些熟悉 Drools 版本的人,旧的 Drools 参数和条件标记等于将一个变量绑定到适当的类型上,然后作为一个 eval 节点使用。 例 . eval p1 : Parameter() p2 : Parameter() eval( ().containsKey(()) ) eval( isValid(p1, p2) ) // 这是如何在 LHS 中进行函数 isValid 调用的方法 . 39。 not39。 图 . not 有效的子条件元素 : Column 39。 not39。 是一阶逻辑的存在判断量词,检查在 Working Memory 中某些 Fact 的存在性。 当前只有 Column 可以在 not 中嵌套,以后将可以支持 and 和 or 进行嵌套(已在 中实现)。 例 . No Busses not Bus() 例 . No red Busses not Bus(color == red) not ( Bus(color == red, number == 42) ) //not 后的括号可选 . 39。 exists39。 存在 图 . exists 有效的子条件元素 : Column 39。 exists39。 是一阶逻辑的存在判断量词,检查在 Working Memory 中某些 Fact 的存在性。 存在的意思是至少有一个。 它不同于只检查 Column 自身的清况。 如果只是要求 Column,则意味着对每一个符 合的 Column。 如果使用 exists 对 Column,则规则仅仅激活一次,而不会考虑 Working Memory中有多少个 Column符合条件。 当前只有 Column 可以在 exists 中嵌套,以后将可以支持 and 和 or 进行嵌套(已在 中实现)。 例 . Atleast one Bus exists Bus() 例 . Atleast one red Bus exists Bus(color == red) . 39。 group39。 图 . group 括号在这里与数学中使用的模式类似,它使得操作的顺序更清晰。 例 . Example of groups ... ( Message( status == ) and Message(message != null) or Message(status == null) ) ... 例 . A rule example rule Approve if not rejected salience 100 agendagroup approval when not Rejection() p : Policy(approved == false, policyState:status) exists Driver(age 25) Process(status == policyState) then log(APPROVED: due to no objections.)。 (true)。 end . 对原型数据自动封箱的提醒 Java 5 支持对原型进行类型适当的自动封箱和拆箱。 这使得代码的阅读方便简捷。 但是 Drools 也支持在 中运行,我们不能依赖于这点( 之后版本不用考虑本节所述问题 )。 在需要的时候 Drools 不得不进行封箱操作。 被查阅的 Field 会自动封箱到对应的对象类型(如 intInteger) ,如果本身已经是对象则不会改变。 但是要注意的是它们不会被自动拆箱。 这样的话,如果你绑定了 field 在一个 int 原型数值上,它的行为在规则中看起来像对象一样 (如断言、返回值约束和 RHS)。 作为一个约定,如果可能的话将你的 fields 换成对象类型(至少直到 java5),或者最少将你的 fields 想象为对象类型,即使它们开始不是。 另一个要注意的是返回值约束,返回值片断必须返回一个对象而不是原型。 现在我期望你可以在Java5 以上版本开发。 因为之前的 java 不是所有都是对象才造成这个头痛的问题。 . Query 查询 图 . query 查询中仅仅包含规则 LHS 部分的结构(不用指定 when 或 then)。 它提供了查询working memory 中符合约束条件的对象的一个简单办法。 要获得查询结果,使用 (name),” name”就是指 query 的名称。 查询名称对于 RuleBase 来说是全局性的,因此在为一个RuleBase 服务的不同 Package 中不要使用重复的查询名称。 下例为所有 30 岁以上的人建立了一个简单的查询。 例 . Query People over the age of 30 query people over the age of 30 person : Person( age 30 ) end 通过在返回的查询结果 (QueryResults)上进行标准的 for 循环遍历,每一行将返回一个 QueryResult,该对象可以用来存取组元中的每一个 Column。 这些 Column可以通过声明的名称或索引位置存取。 例 . Query People over the age of 30 QueryResults results = ( people over the age of 30 )。 ( we have + () + people over the age of 30 )。 ( These people are are over 30: )。 for ( Iterator it =。 ()。 ) { QueryResult result = ( QueryResult ) ()。 Person person = ( Person ) ( person )。 ( () + \n )。 } . Domain Specific Languages 领域语言 如之前介绍, DSL是将规则语言扩展到你自己的问题领域中的办法。 DSL 将规则语言制于你的控制之下,并且可以使用所有规则语言和引擎的 特性。 . 何时使用 DSL DSL 可以用作分离规则编辑(规则的作者)和在规则引擎中操作的对象的一个中间层。 DSL 也可以作为条件或行为的模板,使你可以在规则中重复使用,有时候可能仅仅是用来改变参数。 如果你需要规则能够被非技术人员阅读和使用,如商业分析师, DSL 正好合适。 如果你的规则的条件或推论遵循相似的模式,可以用模板的方式表达;当你希望隐藏实现的细节,而将焦点放在商业规则上时;或者你希望通过提供预定义的模版来控制规则的修改;这些都适合使用 DSL。 DSL 不关注规则的运行时,它们仅仅是分解和编译时需 要的特性。 注意 Drools3 的 DSL 与 Drools 2 基于 XML 的 DSL 很不相同。 XML风格也仍然被支持的,如果你需要的话,可以查看 Drools3 的 Xml 规则语言,并考虑使用 XSLT将 Drools2 中的 XML 映射为 Drools3 XML 语言。 . 修改与管理 DSL DSL 配置是保存在无格式文本文件中。 如果你使用 IDE,你可以获得一个友好的图形编辑器(以及一些校验),但保存文件的格式十分简单。 例 . Example mapping [when]This is {something}=Something(something=={something}) 参考上面的示例, [when]指明了表达式所使用的范围,是属于 LHS或 RHS。 在 [when]之后是要用在规则之内的表达式(通常是自然语言表达式,但不是必需的)。 在‘ =’符号右边的部分是将要映射到的规则语言(当然这个结构依赖于你要用在LHS 还是 RHS上,如果是 LHS,则它是 LSH 的语法,如果是 RHS,则它是 java 代码的片断)。 分解器将获得你指定的表达式,然后取出输入中的 {something}(称为 Tokens)值进行匹配。 与 tokens 匹配的 值获得后将替换等式右边的同名处,所得到的目标表达式是规则引擎实际使用的。 要特别注意的是 DSL 表达式一次处理一行。 这意味着在上面的例子中,所有在”There is”后面直到行未的文本将会被认为是 {something}的值,作为替换目标的实际值。 这样的效果可能不是当你想将不同的 DSL 扩展链接在一起产生一个目标表达式时想要的。 作为绕过这个规则的最好方法是确认 [tokens]使用字符或标点括上。 这意味着分析器沿着句子检查,并将字符之间(在这里是双引号)的值取出。 注意围绕的字符(双引号)在进行内部替代时不会被包含进 去,只有中间的内容被使用(而随后到行尾的内容,将被视为 Case 中的其它情况)。 [译者注:这里的内容直译不易理解,最好参看后面的例子 理解; ] 作为一个惯例,对文本数据使用引号是规则编辑器所默认的。 你也可以在 {tokens}外加上引号以确认你想捕捉的数据。 例 . 引号示例 [when]This is {something} and {an。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。