规则引擎Drools使用 第十一篇 Drools 的高级语法之LHS增强
前面我们已经知道了在规则体中的LHS部分是介于when和then之间的部分,主要用于模式匹配,只有匹配结果为true时,才会触发RHS部分的执行。下面我们会针对LHS部分学习几个新的用法。
目录
复合值限制in/not in
复合值限制是指超过一种匹配值的限制条件,类似于SQL语句中的in关键字。Drools规则体中的LHS部分可以使用in或者not in进行复合值的匹配。具体语法结构如下:
Object(field in (比较值1,比较值2...))
举例:
$s:Student(name in ("张三","李四","王五"))
$s:Student(name not in ("张三","李四","王五"))
条件元素eval
eval用于规则体的LHS部分,并返回一个Boolean类型的值。语法结构如下:
eval(表达式)
举例:
eval(true)
eval(false)
eval(1 == 1)
条件元素not
not用于判断Working Memory中是否存在某个Fact对象,如果不存在则返回true,如果存在则返回 false。语法结构如下:
not Object(可选属性约束)
举例:
not Student()
not Student(age < 10)
条件元素exists
exists的作用与not相反,用于判断Working Memory中是否存在某个Fact对象,如果存在则返回true,不存在则返回false。语法结构如下:
exists Object(可选属性约束)
举例:
exists Student()
exists Student(age < 10 && name != null)
可能有人会有疑问,我们前面在LHS部分进行条件编写时并没有使用exists也可以达到判断Working Memory中是否存在某个符合条件的Fact元素的目的,那么我们使用exists还有什么意义?
两者的区别:当向Working Memory中加入多个满足条件的Fact对象时,使用了exists的规则执行一次,不使用exists的规则会执行多次。
例如:
规则文件(只有规则体):
rule "使用exists的规则"
when
exists Student()
then
System.out.println("规则:使用exists的规则触发");
end
rule "没有使用exists的规则"
when
Student()
then
System.out.println("规则:没有使用exists的规则触发");
end
测试:
kieSession.insert(new Student());
kieSession.insert(new Student());
kieSession.fireAllRules();
上面第一个规则只会执行一次,因为Working Memory中存在两个满足条件的Fact对象,第二个规则会执行两次。
规则继承
规则之间可以使用extends关键字进行规则条件部分的继承,类似于java类之间的继承。
例如:
rule "rule_1"
when
Student(age > 10)
then
System.out.println("规则:rule_1触发");
end
rule "rule_2" extends "rule_1" //继承上面的规则
when
/*
此处的条件虽然只写了一个,但是从上面的规则继承了一个条件,
所以当前规则存在两个条件,即Student(age < 20)和Student(age > 10)
*/
Student(age < 20)
then
System.out.println("规则:rule_2触发");
end
相关文章
- 小程序官方文档解读:如何才能避免违反微信规则
- 抽取非基本验证到规则文件 - A2D规则引擎
- c# 优化代码的一些规则——什么情况下应该使用new[七]
- c# 优化代码的一些规则——用委托表示回调[五]
- DWZ验证表单规则一览
- Ubuntu ufw防火墙规则顺序问题
- TDengine3.0流式计算引擎语法规则介绍
- Linux IPTables:如何添加防火墙规则
- 【我的物联网成长记11】8招带你玩转规则引擎
- java的重写规则
- PostgreSQL的学习心得和知识总结(一百零三)|深入理解PostgreSQL数据库开源MPP扩展Citus 分布表间连接规则类型JoinRuleType 的实现原理
- 转:在提出变革前,你要先想好如何打破旧有的规则
- wazuh hips规则引擎和ossec的差异分析——本质上语法层面和ossec没有变化,但是公共字段提取出来了,同时正则匹配数据提取灵活性更强
- 手把手教你做用户画像——标签数据开发:用户画像工程化的重点模块,包含统计类、规则类、挖掘类、流式计算类标签的开发,标签相关数据可存储在Hive、MySQL、HBase、Elasticsearch等数据库中
- python 提取主域名和子域名代码——先根据规则提取,如果有问题,则使用tldextract
- Git分支命名规则(feature分支/hotfix分支)