【java】drools入门之LHS和RHS语法
很自然地,笔者将分成两部分进行讲解。
1. LHS语法
LHS 是规则条件部分的统称,由 0 个或多个条件元素组成。前面我们已经提到,如果没有条件元素那么默认就是true。
1.1 Pattern 绑定
当匹配到对象时,可以将 FACT 对象绑定到指定的变量上。这里的用法类似于 java 的变量定义。绑定之后,在后面就可以直接使用此变量。
rule ...when$p : Person()thenSystem.out.println( "Person " + $p );end
// 2 person 的 age 属性值相同
Person( $firstAge : age ) // 绑定
Person( age == $firstAge ) // 约束表达式
其中,前缀$只是一个约定标识,有助于在复杂的规则中轻松区分变量和字段,但并不强制要求必须添加此前缀。
1.2 访问 JavaBean 中的属性
任何一个 JavaBean 中的属性都可以访问,不过对应的属性要提供 getter 方法或isProperty 方法。比如:
Person( age == 50 )
// 与上面拥有同样的效果
Person( getAge() == 50 )
1.3 内部类分组访问
通常情况,我们访问一个内部类的多个属性时会有如下的写法:
Person( name == "mark", address.city == "london", address.country == "uk" )
1.4 Java 表达式
在 pattern 的约束条件中,可以任何返回结果为布尔类型的 java 表达式。当然,java 表达式也可以和增强的表达式进行结合使用,比如属性访问。可以通过使用括号来更改计算优先级,如在任一逻辑或数学表达式中。
Person( age > 100 && ( age % 10 == 0 ) )
也可以直接使用 java 提供的工具方法来进行操作计算:
Person( Math.round( weight / ( height * height ) ) < 25.0 )
在使用的过程中需要注意,在 LHS 中执行的方法只能是只读的,不能在执行方法过程中改变 FACT 对象的值,否则会影响规则的正确执行。
1.5 matches 正则表达式
可使用 Java 的正则表达式进行字符串的匹配,通常情况下使用正则表达式字符串进行匹配,但也支持变量值为正确的表达式的方式。此操作符仅适用于字符串属性。如果属性值为 null,匹配的结果始终为 false。
Cheese( type matches "(Buffalo)?\\S*Mozzarella" )
not matches 方法与 matches 相同,唯一不同的是返回的结果与之相反。
Cheese( type not matches "(Buffalo)?\\S*Mozzarella" )
1.6 contains 和 memberOf 操作符
contains 判断一个集合属性或元素是否包含指定字符串或变量值。仅适用于集合属性。也可以用于替代 String.contains()来检查约束条件。not contains 用法与之相同,结果取反。
CheeseCounter( cheeses contains "stilton" ) // 包含字符串
CheeseCounter( cheeses contains $var ) // 包含变量
Cheese( name contains "tilto" )
Person( fullName contains "Jr" )
String( this contains "foo" )
memberOf 用来检查属性值是否为集合,此集合的表示必须为变量。not memberOf 使用方法相同,结果取反。
CheeseCounter( cheese memberOf $matureCheeses )
1.7 字符串操作符 str 和 in
str 操作用来比较一个字符串是否以指定字符串开头或结尾,有可以用于比较字符串的长度。
Message( routingValue str[startsWith] "R1" )
Message( routingValue str[endsWith] "R2" )
Message( routingValue str[length] 17 )
in 和 notin 用来匹配一组数据中是否含一个或多个匹配的字符串,使用的方法与数据库中 in 的使用方法相似。待匹配的数据可以是字符串、变量。
Person( $cheese : favouriteCheese )
Cheese( type in ( "stilton", "cheddar", $cheese ) )
2. THS语法
RHS 是满足 LHS 条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息。RHS 主要用于处理结果,因此不建议在此部分再进行业务判断。如果必须要业务判断需要考虑规则设计的合理性,是否能将判断部分放置于 LHS,那里才是判断条件应该在的地方。
同时,应当保持 RHS 的精简和可读性。如果在使用的过程中发现需要在 RHS 中使用 AND 或 OR 来进行操作,那么应该考虑将
一根规则拆分成多个规则。RHS 的主要功能是对 working memory 中的数据进行 insert、update、delete 或 modify 操作,Drools 提供了相应的内置方法来帮助实现这些功能。下面分别介绍:
2.1 insert 函数
insert 的作用与在 Java 类当中调用 KieSession 的 insert 方法效果一样,都是将 Fact 对象插入到当前的 Working Memory 当中,基本用法格式如下:
insert(newSomething());
调用 insert 之后,规则会进行重新匹配,如果没有设置 no-loop 为 true 或 lock-on-active 为 true 的规则,如果条件满足则会重新执行。update、modify、delete 都具有同样的特性,因此在使用时需特别谨慎,防止出现死循环。
规则文件 insert.drl
package com.rulesimport com.secbro.drools.model.Productrule "insert-check"salience 1when$p : Product(type == GOLD);thenSystem.out.println("insert-check:insert Product success and it's type is " + $p.getType());endrule "insert-action"salience 2whenthenSystem.out.println("insert-action : Toinsert the Product");Product p = new Product();p.setType(Product.GOLD);insert(p);
end
打印日志:
insert-action : To insert the Product
insert-check:insert Product success and it's type is GOLD
Fire 2 rules!
根据优先级首先执行 insert 操作的规则,然后执行结果检测。
2.2 update 函数
update 函数可对 Working Memory 中的 FACT 对象进行更新操作,与 StatefulSession 中的 update 的作用基本相同。查看 KnowledgeHelper 接口中的 update 方法可以发现,update函数有多种参数组合的使用方法。在实际使用中更多的会传入 FACT 对象来进行更新操作。
2.3 delete 函数
将 Working Memory 中的 FACT 对象删除,与 kession 中的 retract/delete 方法效果一样。同时 delete 函数和 retract 效果也相同,但后者已经被废弃。
2.4 modify 函数
modify 是基于结构化的更新操作,它将更新操作与设置属性相结合,用来更改 FACT 对象的属性。语法格式如下:
modify ( <fact-expression> ) {<expression> [ , <expression> ]*
}
其中<fact-expression>必须是 FACT 对象的引用,expression 中的属性必须提供 setter 方法。在调用 setter 方法时,不必再写 FACT 对象的引用,编译器会自动添加。
rule "modify stilton"when$stilton : Cheese(type == "stilton")thenmodify( $stilton ){setPrice( 20 ),setAge( "overripe" )}
end
更多内容可以访问大佬的博客:http://blog.csdn.net/wo541075754
【java】drools入门之LHS和RHS语法相关推荐
- Java Web入门之JSP的基本语法解析及实战(超详细 附源码)
创作不易觉得有帮助请点赞关注收藏~~~ JSP页面是指扩展名为.JSP的文件 在一个JSP页面中 可以包括指令标识 HTML代码 JavaScript代码 嵌入的JAVA代码 注释和JSP动作标识等 ...
- 大数据必学Java知识(一):Java基础入门语法和安装
Java基础入门语法和安装 1. Java概述 1.1 Java语言背景介绍(了解) 1.2 Java语言跨平台原理(理解) 1.3 JRE和JDK(记忆) 1.4 JDK的下载和安装(应用) 2. ...
- drools入门-02
drools入门-02 一. 另一种方式 上一篇我们讲了一下基本理论和入门demo,这一篇我们接着讲 我们用springboot另一种方式整合(这个比较常用) 1. 引入依赖 <!-- 规则引擎 ...
- jboss drools_JBoss Drools –入门
jboss drools 这篇文章是关于我如何掌握JBoss Drools的 . 其背后的原因是:SAP收购了我公司当前的规则引擎,而Drools是我们将寻找的另一种选择,只要有人有能力提高概念验证的 ...
- JBoss Drools –入门
这篇文章是关于我如何掌握JBoss Drools的 . 其背后的原因是:SAP收购了我公司当前的规则引擎,而Drools是我们将寻找的另一种选择,只要有人掌握了概念验证的技能即可. 尽管似乎有大量的文 ...
- java集合入门和深入学习,看这篇就差不多了
一.集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map:两者的区别: 1.Collection是单列集合:Map是双列集合 2.Collection中只有Set系列要 ...
- java集合入门和深入学习
一.集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map:两者的区别: 1.Collection是单列集合:Map是双列集合 2.Collection中只有Set系列要 ...
- Drools入门系列
Drools入门系列(一)HelloWorld Drools入门系列(二)HelloWorld详解之Sample.drl Drools入门系列(三)HelloWorld详解之kmodule.xml D ...
- java基础入门传智播客 源码_Java-_2020年版Java零基础视频教程(Java 0基础,Java初学入门)魔鬼讲师老杜出品...
不会闲聊!!!不会扯淡!!!小UP只会分享与Java相关的学习资源 还记得那年带你Java入门的一声"吼"吗? B站目前播放量已经快到450多万播放量的Java零基础教程的创作者& ...
最新文章
- memcahce 介绍以及安装以及扩展的安装
- 必背单词_研究生满大街走?真实数据来啦 真题必背单词Day10
- Java基础之抽象类
- PHP中的get_defined_funciton和get_defined_vars
- html彩色背景指令,HTML_第四章 颜色背景的CSS,本 章 C S S 的 主 - phpStudy...
- OJDBC版本之间的区别
- 栈的基本操作(详细)
- IOS端APP测试日志查看方法
- html彩色条,html5 canvas彩色流动线条动画特效
- pci-e服务器显卡性能,旗舰显卡不同PCI-E模式下性能对比测试
- 零基础能学平涂插画么?
- ESP32系列:Unhandled debug exception 、Doubled exception错误
- SSL_read: Failure in SSL library (protocol error?)
- QQ功能测试(看点模块)
- PHP两种调用接口方式
- msdn i tell you网址及下载系统详细步骤
- CANoe之CAPL编程(CANoe系列其三)
- 银河系中心黑洞的第一张照片,本文带你了解发现的过程
- 曹操捷龙鸿宇CAD铝单板钣金展开插件
- 企业信息化不可缺少之方正OA
热门文章
- 计算机视觉(CV)方向今年招聘情况怎么样?是否已经人才过剩?
- 编程之美——找符合条件的整数
- input框不可编辑的三种方法
- java一键换壁纸_Java 版下载必应每日壁纸并自动设置 Windows 系统桌面(改编自 C# 版)...
- 淘宝电商:淘宝卖家如何快速提升店铺自然搜索流量?
- 软考-架构师-第三章-数据库系统 第七节 数据库设计(读书笔记)
- 计算机发布信息的方法,介绍两种用电脑给手机发短信的方法
- 生存之道——提高认知度
- 弘辽科技:刘强东下“重手”
- 易语言怎么判断文件是否一样_戒指尺寸怎么量?如何判断大小是否合适