规则引擎-drools-5-决策表

news2024/12/24 20:30:23

文章目录

  • Excel格式决策表 官网地址
  • 决策表使用方式
  • Excel组成部分与drl规则文件对应关系
    • Excel文件内容示例
    • drl规则文件内容
  • Excel决策表内容说明
    • 1. RuleSet
    • 2. RuleTable
    • 3. Attributes
  • 示例
    • Excel
    • 转化drl代码及结果
    • 执行drl代码及结果

Excel格式决策表 官网地址

决策表这部分内容在官网的第16章,其中16.7节是Excel格式的决策表。其他内容决策表我还没研究暂不扩展。
16.7. Spreadsheet decision tables
官网地址:https://docs.drools.org/7.73.0.Final/drools-docs/html_single/index.html#decision-tables-con_decision-tables

决策表使用方式

通过SpreadsheetCompiler API,将按约定定义好的Excel文件内容,转化成drl字符串,从这个角度说,这种Excel格式,也是drools支持的模板类型之一了。
有了drl字符串,后面的使用就和其他drl文件一样了,如可以使用KieHealper将drl字符串加载至drools引擎的生产内存。

Excel组成部分与drl规则文件对应关系

那么,“按约定定义”的Excel文件,约定是什么?也就是Excel需要满足什么样的格式?
三个组成部分:RuleSet、RuleTable、Attributes
Excel文件内容与drl文件内容对应关系如下两个截图:

Excel文件内容示例

Excel截图:

drl规则文件内容

在这里插入图片描述

Excel决策表内容说明

1. RuleSet

在这里插入图片描述

Excel中RuleSet部分,定义的是文件的相关内容,对应drl规则文件中从package到rule关键字之间的部分关键字或对整个规则文件的属性参数定义。
每个参数含义如下:
在这里插入图片描述
其中像import这种可重复使用的定义,可以一个单元格写多个引用,但需要用“,”隔开,如本文截图示例中一样。

2. RuleTable

在这里插入图片描述
这部分对应drl文件中的rule关键字模块,即rule-when-then-end中的内容
其中Name是规则rule后面的rule_name的前缀,完整的rule_name是这个前缀+Excel文件行号。
DESCRIPTION:描述,可以理解为是对Excel文件的描述,便于阅读
CONDITION:对应的是drl文件中when的部分其中第1行为pattern类型约束,第2行为属性约束,第3行为注释,第4行开始是具体的条件参数。从第4行开始,每一行将生成1条rule。
ACTION:与Condition对应的结果,对应drl文件中的then部分。

3. Attributes

在这里插入图片描述
属性部分对应drl文件中的属性,属性名放到DESCRIPTION这一行,可以任意位置,每个属性占一列;属性值放到第4行及以后,每一行是一条rule,因此每个属性值都对应每一条rule。

示例

还以此Excel为例:

Excel

在这里插入图片描述

转化drl代码及结果

代码:

		String realPath = "C:\\Users\\Chengyun.Ding\\Desktop\\决策表.xlsx";//指定决策表xls文件的磁盘路径
        File file = new File(realPath);
        InputStream is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        SpreadsheetCompiler compiler = new SpreadsheetCompiler();
        String drl = compiler.compile(is, InputType.XLS);
        System.out.println();
        System.out.println(drl);
        System.out.println();

执行结果


package rules.excels;
//generated from Decision Table
import com.dcy.drools.excel.Account;
import java.util.List;
import com.dcy.drools.excel.Student;
import com.dcy.drools.excel.Level;
global List<String> list;
// rule values at B13, header at B8
rule "ExcelTable1_13"
	salience 65535
	when
		$account:Account(sex != "女")
	then
		list.add("性别不对或者分数太低");
end

// rule values at B14, header at B8
rule "ExcelTable1_14"
	salience 65534
	no-loop true
	when
		$account:Account(age < 22 || age > 28)
	then
		list.add("ss");
end

// rule values at B15, header at B8
rule "ExcelTable1_15"
	salience 65533
	when
		$account:Account(balance < 1000)
	then
		list.add("dd");
end

执行drl代码及结果

代码:

 // 执行drl
        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(drl, "rules/excels/excelTable.drl");
        KieSession sessionStatefull =  kieHelper.build().newKieSession();

        //设置全局变量,名称和类型必须和规则文件中定义的全局变量名称对应
        List<String> list = new ArrayList();
        sessionStatefull.setGlobal("list",list);

        Account account = new Account();
        account.setBalance(300D);
        account.setAge(35);
        account.setSex("男");
        sessionStatefull.insert(account);

        int count=sessionStatefull.fireAllRules(new RuleNameStartsWithAgendaFilter("ExcelTable1"));

        //激活规则引擎,如果规则匹配成功则执行规则
        System.out.println("用户balance:"+account.getBalance());
        System.out.println("list:"+list);

        //关闭会话
        System.out.println("总共执行了: "+count+" 条规则");
        sessionStatefull.dispose();
        return drl;

结果:

用户balance:300.0
list:[性别不对或者分数太低, ss, dd]
总共执行了: 3 条规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

几种IO模型

IO真正的IO操作涉及到和IO设备的交互&#xff0c;而操作系统限制了应用程序直接和设备交互。我们通常说的IO操作实际上是应用程序和操作系统进行交互&#xff0c;一般会使用操作系统的System Call&#xff0c;即系统调用&#xff0c;读是read()&#xff0c;写是write()&#xf…

设计模式-结构型模式

目录 5.结构型模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 JDK动态代理 5.1.5 CGLIB动态代理 5.1.6 三种代理的对比 5.1.7 优缺点 5.1.8 使用场景 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 应…

聊聊关于矩阵反向传播的梯度计算

目录 1. 前向传播 2. 反向传播 3. 矩阵反向传播 4. 总结 1. 前向传播 建立如图所示的简单网络 W 是权重矩阵&#xff0c;初始赋值为 2*2 的矩阵 X 是输入特征&#xff0c;初始赋值为 2*1 的矩阵 这样通过矩阵乘法 &#xff0c; Y WX &#xff0c;应该得到一个 2*1 的输…

在这竞争激烈的时代,如何才能够在激烈竞争中脱颖而出呢

不管是在职场想要获得认可得到晋升&#xff0c;还是与客户谈合作&#xff1b;都需要你能够脱颖而出。让他人能够看到你并且认可你。那如何才能脱颖而出呢&#xff1f;首先你要先认识自己&#xff0c;知道自己有什么优势、劣势、技能、兴趣、爱好等等。明确自己有什么价值&#…

软件工程(1)--初识基础概念

前言 学习了半年的软件工程课程&#xff0c;总不能一无所获吧&#xff0c;故此写下文章总结一番。 软件工程是一门综合性交叉学科&#xff0c;它涉及计算机科学、工程科学、管理科学和数学等领域。学习目标是掌握需求分析、软件设计、编码风格、软件测试的工程化方法。 软件程序…

什么是股票量化研究?

谈到股票量化研究领域&#xff0c;肯定少不了有自动交易系统的支撑&#xff0c;像平时能将股票池中的数据挖掘出来也能熟能生巧的进行自助量化研究&#xff0c;包括数据接口系统的开发使用都是受到量化的影响&#xff0c;那么&#xff0c;如何看待股票量化研究&#xff1f;像平…

arm版(以uos为例)linux安装mysql8

官网下载&#xff1a;https://downloads.mysql.com/archives/community/上传到服务器&#xff0c;然后解压缩tar -zxvf mysql-8.0.31-linux-glibc2.17-aarch64.tar.gzmv mysql-8.0.31-linux-glibc2.17-aarch64 /usr/local/mysql-8创建MySQL数据目录mkdir -p /datacd datamkdir …

打通对账的最后一公里——对账管理平台

背景 日新月异的科技与快速变化的消费需求不断驱动零售模式的变革&#xff0c;实体商业与数字经济、传统零售与新零售&#xff0c;逐渐融合并形成了全渠道、一体化的发展趋势&#xff0c;也改变了以往企业认知中线上、线下渠道割裂的思维定式&#xff0c;零售快消类企业纷纷建…

电子技术——MOS管的物理特性

电子技术——MOS管的物理特性 增强型 MOSFET 是应用最广泛的场效应晶体管。除了最后一节&#xff0c;我们整章讨论的都是增强型 MOSFET 。我们从它的物理元件结构和物理操作入手&#xff0c;在下一节我们会在本节的基础上学习 MOSFET 的电流-电压特性。 元件结构 上图展示了n-…

Day876.redolog刷盘问题 -MySQL实战

redolog刷盘问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于redolog刷盘问题的内容。 平时的工作中&#xff0c;一条 SQL 语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很…

RPA自动化办公07——Uibot流程加入python插件

参考&#xff1a;扩展UiBot命令_UiBot开发者指南 Uibot是非常方便&#xff0c;但是有些功能可能还需要别的语言来完成&#xff0c;例如python语言&#xff0c;作为胶水语言&#xff0c;在一个Uibot里面插入python脚本是很方便&#xff0c;好用的。 加入插件的位置 在新建一个流…

Seata分布式事务模式(TA、TCC、XA、SAGA)工作机制

前言 分布式应用痛点 分布式应用有一个比较明显的问题就是&#xff0c;一个业务流程通常需要几个服务来完成&#xff0c;业务的一致性很难保证。为了保障业务一致性&#xff0c;每一步都要在 catch 里去处理前面所有的“回滚”操作&#xff0c;可读性及维护性差&#xff0c;开…

分布式微服务

目录 认识微服务 单体服务架构的特点 分布式架构的特点 微服务 SpringCloud 总结 服务拆分及远程调用 服务拆分原则 假如在订单服务中&#xff0c;需要一起返回用户的信息 Eureka注册中心 Eureka的结构和作用 问题&#xff1a;order-service如何得知user-service实例…

基于拓扑的单树分割用于地面激光扫描点云的自动处理

Paper题目&#xff1a;Topology-based individual tree segmentation for automated processing of terrestrial laser scanning point clouds ABSTRACT 地面激光扫描 (TLS) 是一种基于地面的方法&#xff0c;可通过光探测和测距 (LiDAR) 技术快速获取 3D 点云。从 TLS 点云量…

搜索引擎关键字智能提示实践

为了提高阅读体验&#xff0c;请移步到&#xff1a;搜索引擎关键字智能提升实践一、背景搜索关键字智能提示是一个搜索应用的标配&#xff0c;主要作用是避免用户输入错误的搜索词&#xff0c;并将用户引导到相应的关键词上&#xff0c;以提升用户使用体验。雪球以连接人与资产…

【K8S之调度器流程和扩展】如何给 scheduler 添加扩展插件、关闭默认插件、创建多个 scheduler?

参考 自定义 Kubernetes 调度器 阳明https://github.com/cnych/sample-scheduler-extender kube-scheduler 源码位置 kubernetes 调度器的源码位于 kubernetes/pkg/scheduler 中&#xff0c;大体的代码目录结构如下所示&#xff1a;(不同的版本目录结构可能不太一样) kuber…

如何检测文章被搜索引擎收录(如何让搜索引擎收录网站)

如何写网站内容才利于搜索引擎收录 网站关键词要想有好的排名&#xff0c;网站本身必须是被搜索引擎收录的状态&#xff0c;另外&#xff0c;网站上的相关内容收录越多&#xff0c;搜索引擎给与网站关键词的排名靠前概率会越大&#xff0c;那么&#xff0c;网站内容怎样来写会…

[Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )

文章目录生产者消费者模型函数调用角度理解生产者消费者模型生活角度理解生产者消费者模型为什么要使用生产者消费者模型生产者消费者模型优点321原则基于BlockingQueue的生产者消费者模型POSIX信号量回顾信号量概念信号量操作函数环形队列基于环形队列的生产者消费者模型生产者…

Android Studio如何打jar包和aar包并使用

Android Studio如何打jar包和使用生成jar包方式module方式生成jar方式第一类修改主app的方式第二类&#xff1a;通过新建module方式生成jar包如何使用jar包aar生成并使用aar生成aar使用之前有篇文章介绍了so库的生成和使用&#xff0c;看这里&#xff0c;但是&#xff0c;如果我…

[NOI Online #1 入门组] 文具订购

题目描述: 小明的班上共有 n 元班费&#xff0c;同学们准备使用班费集体购买 3 种物品&#xff1a; 圆规&#xff0c;每个 7 元。笔&#xff0c;每支 4 元。笔记本&#xff0c;每本 3 元。 小明负责订购文具&#xff0c;设圆规&#xff0c;笔&#xff0c;笔记本的订购数量分别…