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. 【ClickHouse】0:clickhouse学习4之表相关操作

    Clickhouse对表操作分为四大类:增删查改(INSERT,DROP,SELECT,ALTER). 增,删,查比较简单,改最复杂.那具体有哪些改的操作呢?如下清单: ALTER ALTER TAB ...

  2. 你有对 Vue 项目进行哪些优化?

    (1)代码层面的优化 v-if 和 v-show 区分使用场景 computed 和 watch 区分使用场景 v-for 遍历必须为 item 添加 key,且避免同时使用 v-if 图片资源懒加载 ...

  3. 3.1 Y86-64指令集体系结构

    程序员可见的状态 这里的程序员即可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器.程序员可见的状态如下,有15个程序寄存器(%rax,%rbx等),三个一位的条件(ZF,OF,SF) ,程序 ...

  4. 直播预告:Service Mesh 技术在美团的落地和挑战

    一场突如其来的疫情加深了企业对数字化转型升级的渴望,作为新兴数字化业务的基础,云原生技术的价值日益凸显.当前,越来越多的企业逐步引入容器.微服务/Service Mesh 技术改造业务,实现数据库.P ...

  5. EXPLAIN sql优化方法

    select A . id , A . title , B . title from jos_content   A left join jos_categories B on A . catid = ...

  6. Java21的虚拟线程Virtual Thread初体验

    我们之前使用的是操作系统平台的线程,就称之为"系统线程"吧.虚拟线程是JDK维护的,原理跟WebFlux的底层实现差不多,都是工作线程分离. 要使用虚拟线程,需要使用JDK21以上 ...

  7. oeasy教您玩转 linux 010213 中文 fcitx

     我们来回顾一下 上一部分我们都讲了什么? 管道 ls | cowsay 管道的符号是| 管道的作用是连接 原来应该输出到屏幕的内容 通过管道流到了另一个命令做为参数 这次是否可以让cow说出一些中文 ...

  8. TIER 1: Appointment

    TIER 1: Appointment SQL Structured Query Language 是一种用于管理关系型数据库的编程语言.它是一种标准化的语言,用于定义.操作和管理数据库中的数据. 经 ...

  9. awk替换指定行指定列内容

    例如表格中数值如下1,2,3,41,2,1,22,3,2,3怎么样在原表中,把第二行第三个1替换为5. awk -F"," 'NR==2{$3=5} 1' file.txt -F ...

  10. 【SpringBoot】14 数据访问P2 整合Druid数据源

    [SpringBoot引入Druid数据源] 在整合Jdbc的工程基础上加入这个依赖 并注册一个配置类即可 maven坐标: <!-- https://mvnrepository.com/art ...