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. 全志T113-i+玄铁HiFi4开发板硬件说明书(2)

    前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板,由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感 ...

  2. python3 安装pymssql失败 pip3 install pymssql

    python3 安装pymssql失败 报错信息: AttributeError: module 'platform' has no attribute 'linux_distribution' 解决 ...

  3. JavaScript -- 数据类型 --手稿

  4. 探究kubernetes 探针参数periodSeconds和timeoutSeconds

    探究kubernetes 探针参数 periodSeconds和timeoutSeconds 问题起源 kubernetes probes的配置中有两个容易混淆的参数,periodSeconds和ti ...

  5. webpack4.15.1 学习笔记(七) — 懒加载(Lazy Loading)

    懒加载或者按需加载,是一种很好的优化网页或应用的方式.实际上是先把代码在一些逻辑断点处分离开,然后在一些代码块中完成某些操作后,立即引用或引用另外一些新的代码块.这样加快了应用的初始加载速度,减轻了它 ...

  6. 高程读后感(三)— JS对象实现继承的6种模式及其优缺点

    目录 1.原型链 1.1.默认的原型 1.2.原型和实例的关系 1.3.原型链的问题 2.借用构造函数 2.1.传递参数 2.2.借用构造函数的问题 3.组合继承 4.原型式继承 5.寄生式继承 6. ...

  7. 彻底搞懂python super函数的作用

    super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了. 调用父类同名方法有两种方式: 1.调 ...

  8. STM32F103 SPI详解及示例代码

    1 SPI协议详解 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串 ...

  9. SpringBoot2.7 霸王硬上弓 Logback1.3 → 不甜但解渴

    开心一刻 一大早,她就发消息质问我 她:你给我老实交代,昨晚去哪鬼混了? 我:没有,就哥几个喝了点酒 她:那我给你打了那么多视频,为什么不接? 我:不太方便呀 她:我不信,和你哥们儿喝酒有啥不方便接视 ...

  10. 14、Spring之基于注解的声明式事务

    14.1.概述 14.1.1.编程式事务 事务功能的相关操作全部通过自己编写代码来实现: Connection conn = ...; try { // 开启事务:关闭事务的自动提交 conn.set ...