介绍

从下面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对象,为分别设置收入为10005000

 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常见语法相关推荐

  1. Drools规则属性,高级语法

    目录 规则属性  attributes enabled属性 dialect属性 salience属性 no-loop属性 lock-on-active属性 activation-group属性 age ...

  2. 【转】javascript中的LHS与RHS

    原文链接:http://www.cnblogs.com/yangxiaoguai132/p/5064625.html 最近在学习javascript过程中,接触了LHS与RHS的概念,刚开始的时候有点 ...

  3. Origin画图标签常见语法

    Origin画图标签常见语法 下标:-(x) 上标:+(x) 斜体:\i(x) 加粗:\b(x) x下标y上标: \ =(x,y)

  4. JavaScript : 对LHS和RHS两个名词的理解

    首先见名知意,"L"和"R"的含义,它们分别代表左侧和右侧 一.LHS查询 赋值操作左侧的查询,LHS查询试图找到变量的容器本身,,从而对其赋值 二.RHS查询 ...

  5. JavaScript 的查询机制——LHS 与 RHS

    JavaScript 引擎在查找一个变量的时候,有两种查找机制:LHS 和 RHS. RHS 的查询是简单地查找到某个变量的值,而 LHS 则是试图找到变量的容器的本身. 一个简单的例子:当我们执行 ...

  6. 通俗易懂的LHS和RHS

    在一段代码执行之前,会经过编译阶段 . 在对程序的处理过程中,不可或缺的人物就是:引擎,编译器,作用域. JavaScript在预编译后执行代码时,引擎就会对其进行查询,查询分为: LHS:Left- ...

  7. LHS和RHS的理解

    LHS:赋值操作的目标 RHS:赋值操作的源头 LHS:当变量出现在赋值操作的左侧时进行LHS查询      LHS查询试图找到变量容器本 身      如果查找的目的是对变量进行赋值,就会使用LHS ...

  8. JavaScript中的LHS和RHS查询

    文章是本人大三期间的学习笔记,一些论断取自书籍和网上博客,碍于当时的技术水平有一些写得不够好的地方,可以在评论处理智讨论~ 问题来源于<你不知道的JavaScript(上卷)>,文章部分论 ...

  9. LHS与RHS查询(已完结)

    LHS与RHS查询 什么是LHS与RHS查询 如果查找的目的是对变量进行赋值,那么就会使用LHS 查询:如果目的是获取变量的值,就会使用RHS 查询 考虑以下代码: console.log(a); 其 ...

最新文章

  1. strcpy +memcpy实现循环右移
  2. FFmpeg编写一个简单播放器 -1
  3. 度量、符号、转换关系
  4. python学习笔记(九)——文件和异常(重点)
  5. php 生成css文件怎么打开,php生成html文件的多种步骤介绍
  6. c++ 连接两个字符串实现代码 实现类似strcat功能(转)
  7. 区块链监管的一年,剥离“币”的区块链技术该何去何从?
  8. 74hc595级联c语言程序,74hc595级联程序范例
  9. Android Camera 运行流程
  10. oracle11g rman实例,oracle11g rman备份与恢复详细实例
  11. Visualizing and understanding -- 论文阅读笔记
  12. Windows 使用 ssh 命令行 通过密钥连接到 云服务器
  13. SQLDBX如何连接CACHE!!!
  14. 【差旅随行APP】技术服务支持
  15. Java图片嵌套图片
  16. Jetpack Compose - Switch
  17. mac ssh常见问题
  18. C# 压缩PDF文档
  19. node.js 组件_使用Node.js和TransloadIt构建用户头像组件
  20. windows防火墙规则添加

热门文章

  1. 设置MySQL数据库允许root用户任意IP地址访问(linux)
  2. java word 加密_java 加密解密WORD文档
  3. Android入门教程 Android开发环境搭建【详细教程】
  4. Gohead学习笔记
  5. 解决C Runtime R6034的错误
  6. 可以将matlab安装到u盘吗,如何进行微软的office和matlab以及word等软件导入u盘
  7. STM32入门(二十)----DAC
  8. HTTP 和HTTPS 连接过程详解(SSL TLS)
  9. 关于meta: description HTML 标签的解释 ,SEO
  10. 美国商务旅游白本面签经历分享