Drools LHS与RHS常见语法
介绍
从下面rule规则整体结构可以看出,LHS
其实指的是when后面的条件部分
,RHS
指的是then后面的结论部分
rule “name“ attributes whenLHS --Left Hand Sidethen RHS -- Right Hand Side
end
目录
- 介绍
- 一、LHS
- 1.1、基础语法
- 1.1.1、语法格式
- 1.1.2、且/或不同写法
- 1.1.3、逗号分隔符
- 1.1.4、属性简写
- 1.1.5、变量绑定
- 1.1.6、&&和||特殊写法
- 1.1.7、!.判空符号
- 1.2、集合
- 1.2.1、Map集合
- 1.2.2、List集合
- 1.2.3、集合包含判断
- 1.2.4、属于集合判断
- 二、RHS
- 2.1、insert使用
- 2.2、update使用
- 2.3、delete使用
- 2.4、modify使用
一、LHS
1.1、基础语法
1.1.1、语法格式
格式:patternBinding : patternType ( constraints)
patternBinding
表示对象变量的绑定(前缀为$符号),patternType
指规则匹配的对象类型,constraints
表示规则匹配的条件,比如下面是一个判断职员收入的规则形式
$s:Staff($s.getIncome() >= 5000.00 )
1.1.2、且/或不同写法
下面两种都是且
的条件关系,需要同时满足才会触发规则
$s:Staff($s.getIncome() >= 5000.00 && $s.getIncome() < 10000.00)
$s1:Staff($s1.getIncome() >= 5000.00 )
and
$s2:Staff($s2.getIncome() < 10000.00 )
或
则分别使用||
逻辑或符号和or
关键字
1.1.3、逗号分隔符
逗号分隔符也是且
的关系,如下形式需同时满足两个规则
$s:Staff($s.getIncome() >= 5000.00 , $s.getIncome() < 10000.00)
1.1.4、属性简写
第二种写法属性看上去更简单
$s:Staff($s.getIncome() >= 5000.00)
$s:Staff(income >= 5000.00)
1.1.5、变量绑定
可以在规则对象内部,对属性
进行变量定义,然后在其他地方引用
$s:Staff($ic:income, $ic < 10000)
1.1.6、&&和||特殊写法
按照java的习惯,我们一般会如下方式编写判断条件
$s:Staff(income >= 5000.00 && income < 10000.00)
但在drools中可用如下简化,多个条件使用一个属性即可
$s:Staff(income >= 5000.00 && < 10000.00)
$s:Staff(income ((>= 5000.00 && < 10000.00) || (>= 15000.00 && < 20000.00)))
1.1.7、!.判空符号
通常从对象中获取某个属性值,我们会使用obj.attribute
形式,通过.
号取值,而在drools中还可用使用obj!.attribute
形式,差别在于!.
会先进行obj判空,不为空则取值
1.2、集合
1.2.1、Map集合
定义一个map集合,放入两个值
HashMap<String, String> map = new HashMap<>();map.put("key1","zhangsan");map.put("key2","lisi");kieSession.insert(map);
数据获取:在规则文件中,需要先import
集合,直接绑定变量$m : Map()
后就可以使用
条件判断:Map(this["key1"] == "zhangsan")
表示如果map集合中key1的值为zhangsan,规则才会触发
package com.other;
import java.util.Maprule "mapAndList"when
// $m : Map()$m : Map(this["key1"] == "zhangsan")thenSystem.out.println("key1=" + $m.get("key1"));
end
1.2.2、List集合
定义一个list集合,放入两个Staff
对象,为分别设置收入为1000
和5000
List<Staff> list = new ArrayList<>();Staff s1 = new Staff();s1.setIncome(new BigDecimal(1000));Staff s2= new Staff();s2.setIncome(new BigDecimal(5000));list.add(s1);list.add(s2);kieSession.insert(list);
数据获取:需要先import
集合和对象,直接绑定变量$l : List()
后就可以使用,如果直接获取对象中的属性值,需要先强转
,如((Staff)$l.get(0)).getIncome())
先强转为Staff然后获取里面的属性值
条件判断:$s : Staff(income == 5000) from $l
表示从list集合中提取income等于5000的Staff对象,这里使用到from
关键字
package com.other;
import java.util.List
import com.example.droolsdemo.model.Staffrule "mapAndList"when$l : List()$s : Staff(income == 5000) from $lthenSystem.out.println("Income=" + ((Staff)$l.get(0)).getIncome());System.out.println("Income=" + $s.getIncome());
end
1.2.3、集合包含判断
contains
用于判断集合中是否包含某个值
$s:Staf( skillList contains "java")
not contains
相反
1.2.4、属于集合判断
memberOf
用于判断值中是否属于集合中
$s:Staff( area memberOf ["北京","上海","广州","深圳"])
not memberOf
相反
二、RHS
RHS部分的逻辑,主要是对working memory中的数据进行insert、update、delete或modify操作
2.1、insert使用
insert()
函数是往Working Memory中插入FACT对象
java中写法:
KieSession kieSession = kieContainer.newKieSession("xxxxx-rules");Staff s = new Staff();s.setName("张三");s.setIncome(new BigDecimal(8000.00));kieSession.insert(s);
drl文件中写法:
rule "xxxxxx"whenthenStaff s = new Staff();s.setName("张三");s.setIncome(new BigDecimal(8000.00));insert(s)
end
调用insert()
后,规则会进行重新匹配,所以通常与lock-on-active
属性配合使用,设置为true
则会重新执行满足条件的规则。
2.2、update使用
update()
函数可对Working Memory中的FACT对象进行更新操作
java中写法:
Staff s= new Staff ();//1.执行insert(),并返回fact对象s.setIncome(new BigDecimal(100));FactHandle factHandle = kieSession.insert(s);kieSession.fireAllRules();//2.修改income值,使用update()更新fact对象s.setIncome(new BigDecimal(200));kieSession.update(factHandle, s);kieSession.fireAllRules();
drl文件中写法:
rule "规则一"when$s:Staff(income = 5000.00) then//在规则一中更新了income值,符合规则二的判断条件,所以会触发规则二$s.setIncome(new BigDecimal(8000.00));update($s)
endrule "规则二"when$s:Staff(income == 8000.00) then
end
2.3、delete使用
delete()
函数可对Working Memory中的FACT对象进行删除操作
java中写法:
Staff s= new Staff ();//1.执行insert(),并返回fact对象s.setIncome(new BigDecimal(100));FactHandle factHandle = kieSession.insert(s);kieSession.fireAllRules();//2.使用delete()删除fact对象后,再次执行fireAllRules()时不会触发规则kieSession.delete(factHandle);kieSession.fireAllRules();// 其它写法
// kieSession.delete(factHandle ,FactHandle.State.ALL); //删除所有
// kieSession.delete(factHandle ,FactHandle.State.STATED); //删除真实对象
// kieSession.delete(factHandle ,FactHandle.State.LOGICAL); //逻辑删除
drl文件中写法:
rule "规则一"when$s:Staff(income = 5000.00) then//在规则一中删除了工作内存中的Staff对象,规则二中再次调用时不会触发delete($s)
endrule "规则二"when$s:Staff(income == 5000.00) then
end
2.4、modify使用
modify()
函数用来更改FACT对象中的属性值,格式如下:
modify ( <fact-expression> ) {<expression> [ , <expression> ]*
}
drl文件中写法:
rule "规则一"when$s:Staff(income = 5000.00) then//在规则一中修改Staff对象中的income属性值,规则二中会触发modify($s){setIncome(8000.00)}
endrule "规则二"when$s:Staff(income == 8000.00) then
end
Drools LHS与RHS常见语法相关推荐
- Drools规则属性,高级语法
目录 规则属性 attributes enabled属性 dialect属性 salience属性 no-loop属性 lock-on-active属性 activation-group属性 age ...
- 【转】javascript中的LHS与RHS
原文链接:http://www.cnblogs.com/yangxiaoguai132/p/5064625.html 最近在学习javascript过程中,接触了LHS与RHS的概念,刚开始的时候有点 ...
- Origin画图标签常见语法
Origin画图标签常见语法 下标:-(x) 上标:+(x) 斜体:\i(x) 加粗:\b(x) x下标y上标: \ =(x,y)
- JavaScript : 对LHS和RHS两个名词的理解
首先见名知意,"L"和"R"的含义,它们分别代表左侧和右侧 一.LHS查询 赋值操作左侧的查询,LHS查询试图找到变量的容器本身,,从而对其赋值 二.RHS查询 ...
- JavaScript 的查询机制——LHS 与 RHS
JavaScript 引擎在查找一个变量的时候,有两种查找机制:LHS 和 RHS. RHS 的查询是简单地查找到某个变量的值,而 LHS 则是试图找到变量的容器的本身. 一个简单的例子:当我们执行 ...
- 通俗易懂的LHS和RHS
在一段代码执行之前,会经过编译阶段 . 在对程序的处理过程中,不可或缺的人物就是:引擎,编译器,作用域. JavaScript在预编译后执行代码时,引擎就会对其进行查询,查询分为: LHS:Left- ...
- LHS和RHS的理解
LHS:赋值操作的目标 RHS:赋值操作的源头 LHS:当变量出现在赋值操作的左侧时进行LHS查询 LHS查询试图找到变量容器本 身 如果查找的目的是对变量进行赋值,就会使用LHS ...
- JavaScript中的LHS和RHS查询
文章是本人大三期间的学习笔记,一些论断取自书籍和网上博客,碍于当时的技术水平有一些写得不够好的地方,可以在评论处理智讨论~ 问题来源于<你不知道的JavaScript(上卷)>,文章部分论 ...
- LHS与RHS查询(已完结)
LHS与RHS查询 什么是LHS与RHS查询 如果查找的目的是对变量进行赋值,那么就会使用LHS 查询:如果目的是获取变量的值,就会使用RHS 查询 考虑以下代码: console.log(a); 其 ...
最新文章
- strcpy +memcpy实现循环右移
- FFmpeg编写一个简单播放器 -1
- 度量、符号、转换关系
- python学习笔记(九)——文件和异常(重点)
- php 生成css文件怎么打开,php生成html文件的多种步骤介绍
- c++ 连接两个字符串实现代码 实现类似strcat功能(转)
- 区块链监管的一年,剥离“币”的区块链技术该何去何从?
- 74hc595级联c语言程序,74hc595级联程序范例
- Android Camera 运行流程
- oracle11g rman实例,oracle11g rman备份与恢复详细实例
- Visualizing and understanding -- 论文阅读笔记
- Windows 使用 ssh 命令行 通过密钥连接到 云服务器
- SQLDBX如何连接CACHE!!!
- 【差旅随行APP】技术服务支持
- Java图片嵌套图片
- Jetpack Compose - Switch
- mac ssh常见问题
- C# 压缩PDF文档
- node.js 组件_使用Node.js和TransloadIt构建用户头像组件
- windows防火墙规则添加