Drools决策表的使用

官方文档决策表说明

Drools 决策表的使用 16.7. Spreadsheet decision tables

决策表使用方式

在Drools中,决策表通常是以Excel(.xls或.xlsx)或者CSV格式存储的,这些格式的决策表并不能直接被Drools执行。它们需要被转换成Drools规则语言(DRL)的文本格式,之后才能被编译和执行。
Drools提供了工具来帮助完成这一转换,主要使用org.drools.decisiontable.SpreadsheetCompiler类

以下是一个基本的转换过程

这是我的决策表:
表一( Pricing bracket)

表二(Discounts)

文件名称:ExamplePolicyPricing.xls

项目的结构目录:

	 // 加载决策表文件
InputStream is = DecisionTableToDRL.class.getResourceAsStream("/path/to/decisiontable.xls"); // 创建SpreadsheetCompiler实例
SpreadsheetCompiler compiler = SpreadsheetCompilerFactory.newCompiler(); // 转换决策表为DRL
String drl = compiler.compile(is, "UTF-8", "decisiontable"); // 打印DRL规则
System.out.println(drl);
 

xls转为drl结果为:

package com.mk.examples.decisiontable;
//generated from Decision Table
import com.mking.drools.bean.decisiontable.*;
// rule values at B9, header at B4
rule "Pricing bracket_9"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "LOW", priorClaims == "1")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(450);
end // rule values at B10, header at B4
rule "Pricing bracket_10"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "MED")
policy: Policy(type == "FIRE_THEFT")
then
policy.setBasePrice(200);
System.out.println("Priors not relevant");
end // rule values at B11, header at B4
rule "Pricing bracket_11"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "MED", priorClaims == "0")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(300);
end // rule values at B12, header at B4
rule "Pricing bracket_12"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "LOW")
policy: Policy(type == "FIRE_THEFT")
then
policy.setBasePrice(150);
end // rule values at B13, header at B4
rule "Pricing bracket_13"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "LOW", priorClaims == "0")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(150);
System.out.println("Safe driver discount");
end // rule values at B14, header at B4
rule "Pricing bracket_14"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "MED", priorClaims == "1")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(700);
end // rule values at B15, header at B4
rule "Pricing bracket_15"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "HIGH", priorClaims == "0")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(700);
System.out.println("Location risk");
end // rule values at B16, header at B4
rule "Pricing bracket_16"
when
Driver(age >= 18, age <= 24, locationRiskProfile == "HIGH")
policy: Policy(type == "FIRE_THEFT")
then
policy.setBasePrice(550);
System.out.println("Location risk");
end // rule values at B17, header at B4
rule "Pricing bracket_17"
when
Driver(age >= 25, age <= 30, priorClaims == "0")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(120);
System.out.println("Cheapest possible");
end // rule values at B18, header at B4
rule "Pricing bracket_18"
when
Driver(age >= 25, age <= 30, priorClaims == "1")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(300);
end // rule values at B19, header at B4
rule "Pricing bracket_19"
when
Driver(age >= 25, age <= 30, priorClaims == "2")
policy: Policy(type == "COMPREHENSIVE")
then
policy.setBasePrice(590);
end // rule values at B20, header at B4
rule "Pricing bracket_20"
when
Driver(age >= 25, age <= 35, priorClaims == "3")
policy: Policy(type == "THIRD_PARTY")
then
policy.setBasePrice(800);
System.out.println("High risk");
end // rule values at B27, header at B22
rule "Discounts_27"
when
Driver(age >= 20, age <= 24, priorClaims == "0")
policy: Policy(type == "COMPREHENSIVE")
then
policy.applyDiscount(1);
end // rule values at B28, header at B22
rule "Discounts_28"
when
Driver(age >= 18, age <= 24, priorClaims == "0")
policy: Policy(type == "FIRE_THEFT")
then
policy.applyDiscount(2);
end // rule values at B29, header at B22
rule "Discounts_29"
when
Driver(age >= 25, age <= 30, priorClaims == "1")
policy: Policy(type == "COMPREHENSIVE")
then
policy.applyDiscount(5);
end // rule values at B30, header at B22
rule "Discounts_30"
when
Driver(age >= 25, age <= 30, priorClaims == "2")
policy: Policy(type == "COMPREHENSIVE")
then
policy.applyDiscount(1);
end // rule values at B31, header at B22
rule "Discounts_31"
when
Driver(age >= 25, age <= 30, priorClaims == "0")
policy: Policy(type == "COMPREHENSIVE")
then
policy.applyDiscount(20);
end
 

执行drl代码及结果

动态加载drl可以参考该文:Drools实践与动态加载
以下是drl解析过程:

 KieHelper kieHelper = new KieHelper();
kieHelper.addContent(drl, ResourceType.DRL); KieSession ksession = kieHelper.build().newKieSession();
Driver def = new Driver();
Policy policy = new Policy();
ksession.insert(def);
ksession.insert(policy);
int count = ksession.fireAllRules();
ksession.dispose();
 

添加微信,_ 不定时更新代码demo示例
添加 回复 “drools-demo” 获取示例代码

Drools决策表实践运用的更多相关文章

  1. drools决策表的简单使用

    目录 一.背景 二.一个简单的决策表 1.在同一个决策表中处理多个Sheet页 2.RuleSet下方可以有哪些属性 3.RuleTable下方可以有哪些属性 4.规则属性的编写 三.需求 四.实现 ...

  2. drools决策表的使用

    决策表我们在drools规则引擎初探里做了简单介绍,这里主要是介绍如何通过java代码来把这个excel文件和drools关联起来,如何使其达到我们想要的效果. 这里假设我们在resources目录下 ...

  3. Drools规则引擎实践直白总结

    目录 1. 创建Drools环境(引入Drools相关依赖包.现在都流行spring boot,故最简单有效的依赖才是最好的,kie-spring内部自行依赖了drools相关核心的依赖包) 2. 了 ...

  4. Drools环境搭建(转)

    Eclipse3.5安装Drools5.2.0.Final插件 到Drools下载页面(现在是http://www.jboss.org/drools/downloads.html) -下载并解压Dro ...

  5. 小明历险记:规则引擎drools教程一

    小明是一家互联网公司的软件工程师,他们公司为了吸引新用户经常会搞活动,小明常常为了做活动加班加点很烦躁,这不今天呀又来了一个活动需求,我们大家一起帮他看看. 小明的烦恼 活动规则是根据用户购买订单的金 ...

  6. Drools文档(六) 用户手册

    用户手册 基础 无状态的知识Session Drools规则引擎拥有大量的用例和功能,我们要如何开始?你无须担心,这些复杂性是分层的,你可以用简单的用例来逐步入门. 无状态Session,无须使用推理 ...

  7. Drools文档(八) 规则语言参考

    规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领 ...

  8. jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

    前言 目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5 ...

  9. HRMS(人力资源管理系统)-SaaS架构设计-概要设计实践

    一.开篇 前期我们针对架构准备阶段及需求分析这块我们写了2篇内容<HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性.非功能性.关键约束)-上篇><HRMS(人 ...

  10. 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用

    https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...

随机推荐

  1. Redis挂了,怎么补救?谈谈如何实现redis的高可用

    Redis挂了,怎么补救?谈谈如何实现redis的高可用! Redis实现高可用主要有三种部署模式:主从模式.哨兵模式和集群模式. 分区 分区(Partitioning)是一种最为简单的拓展方式. 在 ...

  2. 搜索Python编程获取相关图书信息

    1.获取相关图书信息 #搜索"Python编程"获取相关图书信息 from selenium import webdriver from selenium.webdriver.su ...

  3. Tiny RDM 刚上线就收获一众好评的Redis桌面开源客户端!值得拥有!

    相信对Redis有频繁操作需求的用户,大部分会选择一个顺手的图形化界面工具来代替手动命令行操作以提高效率.Tiny RDM作为一款现代化轻量级的跨平台Redis桌面客户端,为用户提供了便捷高效的Red ...

  4. 最简GIF解析代码gif_jumper,用于stb_image的小改进

    gif jumper gif支持多帧动画,但是没有存储总帧数,解析gif直到结束才能知道总帧数. 所以gif解析代码,要么采用链表,要么不停realloc()分配内存,stb_image的代码就是如此 ...

  5. oeasy教您玩转linux010206 蒸汽机车 sl

    我们来回顾一下 上一部分我们都讲了什么? 两种字符画 从figlet开始️ 到toilet 字符画选项 变彩色 字体效果 figlet oeasy toilet oeasy 这里面还有什么好玩的游戏可 ...

  6. vs2019如何自动生成有下划线前缀的字段名?

    vs2019代码自动完成功能非常强大,今天要说的是根据构造函数的参数自动生成字段的事儿. 下图所示,IDE可以根据构造函数的参数自动生成私有字段 这个功能非常好,代码编写效率大大提升,生成的代码如下: ...

  7. 学习笔记--Java 运算符

    Java 运算符 算术运算符 关系运算符 逻辑运算符 位运算[略] 赋值运算符 字符串连接符 三元运算符 Java 运算符 按照功能划分: 功能 运算符 算术运算符 +.-.*./.++.--.% 关 ...

  8. fasterWhisper和MoneyPrinterPlus无缝集成

    MoneyPrinterPlus之前使用的是各种云厂商的语音识别服务来进行语音的视频和字幕的识别工作. 但是很多小伙伴说云服务用不起. 那么没办法,MoneyPrinterPlus上线最新版本,支持f ...

  9. OI生涯回忆&退役之后

    一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程 --<庄子·秋水> 好吧,现在是2024年7月24日,我现在正坐在某编程机构的办公室电脑旁,写下这些文字,是啊,我已经退役将近两 ...

  10. 【YAML】非标记语言的标记语言

    什么是YAML? YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写. 在开发的这种语言时,YAML 的意思其实是:&qu ...