iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >drools中then部分的写法(推荐)
  • 919
分享到

drools中then部分的写法(推荐)

2024-04-02 19:04:59 919人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、背景2、支持的方法2.1 insert 插入对象到工作内存中2.1.1 需求2.1.2 drl文件编写2.1.3 部分java代码编写2.1.4 运行结果2.1.5 结论2.

1、背景

此处介绍一下droolsthen部分的写法,以及一些内置的方法,比如insert/delete/modify等等。同时也介绍一下rule的继承,和在when中实现if else if 等操作。

2、支持的方法

drools提供了一些内置的方法,这些方法会修改drools的工作内存Fact对象的值。从而会导致重新进行模式匹配。

2.1 insert 插入对象到工作内存中

insert是向工作内存中插入对象,同时会导致重新进行规则的模式匹配。同时当规则不满足时,不会自动删除。

2.1.1 需求

当发生火灾Fire时,向工作内存中插入一个Alarm对象,告警发生后,删除工作内存中的Fire对象,然后检测Alarm对象是否还存在。

2.1.2 drl文件编写

package rules
import com.huan.drools.insertmethod.Fire
import com.huan.drools.insertmethod.Alarm
rule "insert_发生火灾时,往工作内存中插入告警对象"
    when
        $fire: Fire()
    then
        System.out.println("1、发生火灾时,往工作内存中插入告警对象");
        insert(new Alarm($fire));
end
rule "insert_当规则内存中存在告警对象,进行告警,然后删除火灾对象"
    when
        $fire: Fire()
        $alarm: Alarm( fire == $fire )
    then
        System.out.println("2、进行告警,然后删除对应的火灾对象");
end
rule "insert_检测告警对象是否还是存在-01"
    when
        Alarm()
    then
        System.out.println("3、insert 插入的告警对象还存在");
        // 删除工作内存中的Fire对象
        delete($fire);
end
rule "insert_检测告警对象不存在"
    when
        not Alarm()
    then
        System.out.println("3、insert 插入的告警对象不存在");
end

此处使用的是 insert进行插入

2.1.3 部分java代码编写

// 将火灾对象插入到工作内存中
kieSession.insert(new Fire());
// 只触发规则名称以 insert_ 开头的规则
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("insert_"));

2.1.4 运行结果

1、发生火灾时,往工作内存中插入告警对象
2、进行告警,然后删除对应的火灾对象
3、insert 插入的告警对象还存在

2.1.5 结论

  • insert可以向工作内存中插入Fact对象。
  • insert方法调用后,会导致模式的重新匹配,导致之前不会执行的规则,重新执行。
  • insert方法插入到工作内存的对象,在规则不成立时,不会自动删除,需要手动删除,注意和insertLogical的区别

2.2 insertLogical 插入对象到工作内存中

insert是向工作内存中插入对象,同时会导致重新进行规则的模式匹配。同时当规则不满足时,会自动删除。

2.2.1 需求

当发生火灾Fire时,向工作内存中插入一个Alarm对象,告警发生后,删除工作内存中的Fire对象,然后检测Alarm对象是否还存在。

2.2.2 drl文件编写

package rules
import com.huan.drools.Fire
import com.huan.drools.Alarm
rule "insertLogical_发生火灾时,往工作内存中插入告警对象"
    when
        $fire: Fire()
    then
        System.out.println("1、发生火灾时,往工作内存中插入告警对象");
        insertLogical(new Alarm($fire));
end
rule "insertLogical_当规则内存中存在告警对象,进行告警,然后删除火灾对象"
    when
        $fire: Fire()
        $alarm: Alarm( fire == $fire )
    then
        System.out.println("2、进行告警,然后删除对应的火灾对象");
        delete($fire);
end
rule "insertLogical_检测告警对象是否还是存在-01"
    when
        Alarm()
    then
        System.out.println("3、insertLogical 插入的告警对象还存在");
end
rule "insertLogical_检测告警对象不存在"
    when
        not Alarm()
    then
        System.out.println("3、insertLogical 插入的告警对象不存在");
end

此处使用的是insertLogical插入

2.2.3 部分java代码编写

kieSession.insert(new Fire());
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("insertLogical_"));

2.2.4 运行结果

1、发生火灾时,往工作内存中插入告警对象
2、进行告警,然后删除对应的火灾对象
3、insertLogical 插入的告警对象不存在

2.2.5 结论

  1. insertLogical可以向工作内存中插入Fact对象。
  2. insertLogical方法调用后,会导致模式的重新匹配,导致之前不会执行的规则,重新执行。
  3. insertLogical方法插入到工作内存的对象,在规则不成立时,会自动删除注意和insert的区别

2.3、update 更新工作内存中的对象

update: 使用它来指定要更新的字段和整个相关Fact,并将更改通知 Drools 引擎。 Fact发生更改后,您必须在更改可能受更新值影响的另一个事实之前调用 update。 为避免此添加步骤,请改用 modify 方法。

2.3.1 需求

规则一: 当工作内存中存在火灾对象Fire,并且名字name为空时触发规则,同时在设置火灾的名字为大火灾
规则二: 当火灾存在名字时,输出火灾名字

2.3.2 drl 文件编写

package rules
import com.huan.drools.Fire
import com.huan.drools.Alarm
rule "update_当存在火灾对象时,设置一个火灾的名字"
    when
        $fire: Fire(name == null)
    then
        System.out.println("1、设置火灾名字");
        $fire.setName("大火灾");
        update($fire)
end
rule "update_当火灾对象存在名字时触发"
    when
        $fire: Fire(name != null)
    then
        System.out.println("2、火灾对象的名字为: " + $fire.getName());
end

2.3.3 部分java文件编写

kieSession.insert(new Fire());
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("update_"));

2.3.4 运行结果

1、设置火灾名字
2、火灾对象的名字为: 大火灾

2.3.4 结论

  • update会导致模式的重新匹配。
  • update会修改工作对象内存中的值。

2.4、modify 更新工作内存中的对象

modify: 使用它来指定要为Fact对象修改的字段并将更改通知 Drools 引擎。 此方法提供了一种结构化的事实更新方法。 它将更新操作与 setter 调用相结合以更改对象字段。

2.4.1 需求

规则一: 当工作内存中存在火灾对象Fire,并且名字name为空时触发规则,同时在设置火灾的名字为大火灾
规则二: 当火灾存在名字时,输出火灾名字

2.4.2 drl 文件编写

package rules
import com.huan.drools.Fire
import com.huan.drools.Alarm
rule "modify_当存在火灾对象时,设置一个火灾的名字"
    when
        $fire: Fire(name == null)
    then
        System.out.println("1、设置火灾名字");
        modify($fire){
            setName("大火灾")
        }
end
rule "modify_当火灾对象存在名字时触发"
    when
        $fire: Fire(name != null)
    then
        System.out.println("2、火灾对象的名字为: " + $fire.getName());
end

2.4.3 部分java文件编写

kieSession.insert(new Fire());
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("modify_"));

2.4.4 运行结果

  • 1、设置火灾名字
  • 2、火灾对象的名字为: 大火灾

2.4.5 结论

  • modify会导致模式的重新匹配。
  • modify会修改工作对象内存中的值。一般情况下使用modify,不要使用update

2.5 delete 删除工作内存中的对象

用法:delete(<object>)

retract也是和delete一样的效果,但是推荐使用delete

3、drools变量的简单使用

package rules
rule "drools_变量的使用"
    wh
        eval(true)
    then
        System.out.println("Match激活的当前触发规则: " + drools.getMatch());
        System.out.println("当前触发规则的名字: " + drools.getRule().getName());
        // System.out.println("终止规则执行fireUntilHalt(): " + drools.getKieRuntime().halt());
        // System.out.println("激活AgendaGroup组: " + drools.getKieRuntime().getAgenda().getAgendaGroup( "CleanUp" ).setFocus());
        System.out.println("获取所有全局变量: " + drools.getKieRuntime().getGlobals());
        // System.out.println("设置全局变量:" +  drools.getKieRuntime().setGlobal("username","huan"); );
        // System.out.println("获取查询结果:" + drools.getKieRuntime().getQueryResults());
end

4、规则的继承

4.1 需求

规则一: 如果用户(customer)的年龄(age)大于60岁,则打0.9折。
规则二: 在规则一的基础上,如果用户有车(car),则可以免费停车(freeParking)。

4.2 drl文件编写

package rules
import com.huan.drools.Customer
import com.huan.drools.Car
rule "rule_extends_规则一"
    when
        $c: Customer(age > 60)
    then
        modify($c){
            setDiscount(0.9)
        }
        System.out.println("触发规则一:用户年龄>60岁,打0.9折");
end
// 规则二继承规则一的条件
rule "rule_extends_规则二" extends "rule_extends_规则一"
    when
        $car: Car()
    then
        modify($car){
            setFreeParking(true)
        }
        System.out.println("触发规则二:用户有车,免费停车");
end

此处rule_extends_规则二继承了rule_extends_规则一,所以规则一的条件也继承了。

4.3 部分java代码

Car car = new Car();
Customer customer = new Customer();
customer.setAge(65);
kieSession.insert(customer);
kieSession.insert(car);
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("rule_extends_"));

客户有车,并且年龄是65岁,满足上方的规则一和规则二

4.4 运行结果

触发规则一:用户年龄>60岁,打0.9折
触发规则二:用户有车,免费停车

4.5 结论

可以看到在rule上使用extends关键字,可以实现规则的继承。

5、使用do[...]语法重写上方继承的例子

5.1 需求

只要用户大于60岁,直接打0.9折,如果还有车,则可以免费停车。

5.2 drl文件编写

package rules
import com.huan.drools.Customer
import com.huan.drools.Car
rule "命名结果_rule"
    when
        $c: Customer(age > 60)
        do[giveDiscount] // 当上方的条件成立时执行 then [giveDiscount]
        $car: Car() // 此条件成立时,执行默认的 then
    then
        modify($car){
            setFreeParking(true)
        };
        System.out.println("用户有车,免费停车");
    then [giveDiscount]
        modify($c){
            setDiscount(0.9)
        };
        System.out.println("用户年龄>60岁,打0.9折");
end

解释: 见上方的规则文件里的注视

5.3 部分java代码编写

Car car = new Car();
Customer customer = new Customer();
customer.setAge(65);
kieSession.insert(customer);
kieSession.insert(car);
kieSession.fireAllRules(new RuleNameStartsWithAgendaFilter("命名结果_"));

5.4 运行结果

用户年龄>60岁,打0.9折
用户有车,免费停车

也实现了需求

5.5 结论

通过when中使用 do[名字] 然后 then then 名字 也可以实现。

6、实现 if else if 的效果

6.1 需求

完成类似 if else if else效果。见下方的各种执行结果

6.2 规则文件

rule "if else-if"
    when
       $customer: Customer(age > 60) // 规则内存中存在Customer对象,并且age>60
        if($customer.getLevel() == 1) do[level1] // 用户的级别是1,执行then[level1],然后继续执行下方的条件
        else if ($customer.getLevel() == 2) break[level2] // 用户的级别是2,执行then[level2],不在执行下方的条件
        else do[levelOther] // 其他的level级别,执行then[levelOther],然后在执行下方的条件
        Car()
    then
        System.out.println("我执行了");
    then[level1]
        System.out.println("level1");
    then[level2]
        System.out.println("level2");
    then[levelOther]
        System.out.println("levelOther");
end

6.3 执行结果图

6.4 各种执行结果-也就是上图的解释

1、Customerage小于60
输出: 没有输出。
2、Customerage大于60并且level=1,没有Car
输出: level1
3、Customerage大于60并且level=1,有Car
输出: level1 我执行了
4、Customerage大于60并且level=2,没有Car
输出: level2
5、Customerage大于60并且level=2,有Car
输出: level2
6、Customerage大于60并且level=3,没有Car
输出: levelOther
7、Customerage大于60并且level=3,有Car
输出: levelOther 我执行了

6.5 do和 break 有什么区别

do:执行完之后,还会继续判断后面的执行条件。 (即还会执行后面的Car判断,根据是否有Car获取不同的结果
break:执行完之后,不会在判断后面的执行条件。(即忽略了后面的Car判断,rule执行完了

7.完整代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-then

8.参考文档

Https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#drl-rules-THEN-con_drl-rules

到此这篇关于drools中then部分的写法的文章就介绍到这了,更多相关drools中then写法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: drools中then部分的写法(推荐)

本文链接: https://www.lsjlt.com/news/149777.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • drools中then部分的写法(推荐)
    目录1、背景2、支持的方法2.1 insert 插入对象到工作内存中2.1.1 需求2.1.2 drl文件编写2.1.3 部分java代码编写2.1.4 运行结果2.1.5 结论2....
    99+
    2024-04-02
  • drools中then部分怎么写
    这篇文章主要介绍“drools中then部分怎么写”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“drools中then部分怎么写”文章能帮助大家解决问题。1、背景此处介绍一下drools中then部...
    99+
    2023-06-30
  • oracle中when和then的写法
    在 oracle 中,when 和 then 语法用于 case 表达式,用于基于条件返回不同的值:when 子句指定评估的条件。then 子句指定条件为真时返回的值。else 子句(可...
    99+
    2024-05-03
    oracle
  • Java中List for循环的6种写法总结(推荐)
    如下所示:List<String> list = new ArrayList<String>();for (int i = 0; i < list.size(); i++) {System.out.printl...
    99+
    2023-05-31
    list for循环 java
  • 详解JavaScript中if语句优化和部分语法糖小技巧推荐
    目录前言if else 基本使用简化if判断和优化代码单行if else使用&& || 优化使用三目运算符优化合并if使用includes 或者indexof使用sw...
    99+
    2024-04-02
  • redis在php中常用的语法【推荐】
    Redis是一个C/S结构类型的服务,C是指客户端,S是指服务端,客户端与服务端可以通过网络进行通信。对于redis而言,服务端上需要安装redis服务,那客户端呢?其实redis为很多语言提供了API,都...
    99+
    2024-04-02
  • PHP中的推荐算法实现指南
    随着计算机技术的不断发展和数据量的快速增长,推荐系统在互联网应用中的作用日益重要。作为一种基于用户历史行为和兴趣的算法组合,推荐系统已经成为了电商、社交媒体等许多领域的关键技术之一。在推荐系统的实现中,算法选择是至关重要的。作为一种常见的服...
    99+
    2023-05-23
    PHP 推荐算法 实现指南
  • 强烈推荐!Vue3.2中的setup语法糖
    目录前文1.什么是setup语法糖2.使用setup组件自动注册3.使用setup后新增API3.1 defineProps3.2 defineEmits3.3 defineExpo...
    99+
    2024-04-02
  • Go语言中的Shell脚本编写技巧和LeetCode算法练习推荐
    Shell脚本是Unix和Linux操作系统中最常见的脚本语言之一,它可以用来自动化执行一些重复性的任务,比如批量处理文件、备份数据等。而Go语言则是一门比较新的编程语言,它的语法简洁、易于学习和使用,适合于编写高性能的网络应用程序和云计...
    99+
    2023-06-20
    shell 日志 leetcode
  • Windows 系统中的 ASP 日志分析工具推荐
    在开发 ASP 网站时,日志分析是非常重要的一环。通过日志分析,我们可以了解网站访问情况、用户行为、异常情况等,从而为网站的优化和改进提供依据。但是,如何高效地分析 ASP 日志呢?本文将向大家介绍几款 Windows 系统中的 ASP ...
    99+
    2023-11-06
    日志 windows bash
  • Oracle 11gR2中启动Scott用户的方法(推荐)
    Oracle 中启动 Scott 用户 的方法 , 在 Oracle11gR2, (g 代表‘网络'的意思) 数据库中 Scott 这个用户 安装时是被锁定的, 安装 Oracle的时候 ,你可以直接选择 ...
    99+
    2024-04-02
  • vue3中ref和reactive的用法和解析(推荐)
    目录1.前言2.比较3.ref源码解析4.reactive源码解析createReactiveObjecthandles的组成get陷阱set陷阱5.总结1.前言  &nb...
    99+
    2023-03-19
    vue3 ref和reactive用法 vue3 ref和reactive
  • PHP商城开发中的智能推荐算法
    随着互联网的普及和电商的快速发展,电商领域的竞争也越来越激烈。为了提升用户的购物体验和增加商品销售量,商城开发中的智能推荐算法越来越受到重视。其中,PHP商城开发中的智能推荐算法是一种非常有效的推荐方式。一、智能推荐算法概述智能推荐算法是指...
    99+
    2023-05-22
    PHP 商城 推荐算法
  • Java中四种遍历List的方法总结(推荐)
    实例如下:package com.ietree.basic.collection.loop;import java.util.ArrayList;import java.util.Iterator;import java.util.List...
    99+
    2023-05-31
    java list 遍历
  • C++中的String的常用函数用法(最新推荐)
    目录一. string的构造函数的形式:二. string的大小和容量::三. string的字符串比较::四. string的插入:push_back() 和 insert()五、...
    99+
    2023-02-06
    C++ String常用函数用法 C++ String常用函数 C++ String函数用法
  • css中不推荐使用行内样式的示例分析
    这篇文章给大家分享的是有关css中不推荐使用行内样式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。css不推荐使用行内样式,即直接将样式属性写在HTML标签的style属性中。行内样式的缺点:1、结构样...
    99+
    2023-06-14
  • edittext + listview 实现搜索listview中的内容方法(推荐)
    主要原理:是在主界面有两个空间,一个是EditText,一个是ListView,ListView是放在EditText下面的,然后自定义建立一个adapter适配器,这个适配器要继承Filterable这个接口,并实现这个接口的两个方法,一...
    99+
    2023-05-31
    搜索 listview edittext
  • 三分钟让你快速学会axios在vue项目中的基本用法(推荐!)
    目录Axios简介一、axios是干啥的二、安装使用三、Axios请求方式1、axios可以请求的方法:2、get请求3、post请求4、put和patch请求5、delet ...
    99+
    2024-04-02
  • Mybatis分页插件PageHelper的配置和简单使用方法(推荐)
    前言在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页。前端分页一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计算count和分页逻辑,一般前端组件(例...
    99+
    2023-05-30
    mybatis 分页插件 pagehelper
  • Java中的缓存加载算法有哪些值得推荐的?
    Java是一门广泛使用的编程语言,其在开发过程中,缓存加载算法显得尤为重要。本文将介绍几种值得推荐的Java中的缓存加载算法。 LRU算法 LRU算法(Least Recently Used)是一种常用的缓存加载算法。该算法的思路是,当...
    99+
    2023-09-27
    load 缓存 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作