采用Excel作为可视化设计器的开源规则引擎 NopRule

决策树和决策矩阵是业务人员可以直观理解的复杂IF-ELSE逻辑表达形式,也是规则引擎中最常用、最有用的部分。常见的规则引擎如Drools虽然提供了更加丰富的功能特性集,
特别是所谓的RETE算法可以用于高效复用多次重复出现的表达式片段,但在实际业务应用中很少出现必须使用RETE算法的情况,大部分情况下我们都是把规则引擎降级为决策表和决策矩阵来使用。

合理安排决策树和决策矩阵的节点顺序已经可以起到优化执行的作用。对于必须使用RETE算法的情况往往一般人已经难以直观理解,难以交给业务人员直接配置。
甚至程序员理解其中的执行细节也存在困难,还不如手工实现更加便于优化。基本的决策表+类似流程图的执行控制往往比使用RETE算法更加合用。

NopRule是一个非常轻量级的规则引擎,它可以嵌入在Java程序内部使用,也可以作为微服务被远程调用。
它提供了在线可视化设计界面,可以将规则模型保存在数据库中实现动态更新,同时也可以使用静态的模型文件,不依赖数据库存储。

与NopReport报表引擎类似,NopRule可以使用Excel作为可视化设计工具,直接导入Excel格式的规则模型,极大简化了业务规则的设计和使用。

一. 使用方式

仿照nop-quarks-demo工程中的做法,在pom文件中可以引入如下模块

    <dependency><groupId>io.github.entropy-cloud</groupId><artifactId>nop-rule-service</artifactId></dependency><dependency><groupId>io.github.entropy-cloud</groupId><artifactId>nop-rule-web</artifactId></dependency>

nop-rule-service提供后端规则服务。nop-rule-web包含对应的amis前端管理页面。

/_vfs/nop/demo/app.action-auth.xml中引入nop-rule.action-auth.xml,其中定义了用于测试的功能菜单

<auth x:extends="/nop/auth/auth/nop-auth.action-auth.xml,/nop/sys/auth/nop-sys.action-auth.xml,/nop/rule/auth/nop-rule.action-auth.xml">
</auth>

启动后访问http://localhost:8080/#/NopRuleDefinition-main

1.1 规则调用

可以通过RuleService接口调用远程规则服务

Map<String,Object> inputs = new HashMap<String,Object>();
inputs.put("season","Winter");
inputs.put("guestCount",10);RuleRequestBean request = new RuleRequestBean();
request.setRuleName("test-decision-table");
request.setInputs(inputs);RuleResponseBean response = ruleService.executeRule(ApiRequest.build(inputs)).get();
Map<String,Object> outputs = response.getOutputs();

如果是嵌入在Java程序内部使用,则可以直接使用IRuleManager接口,减少请求对象的包装转换

IRuleManager ruleManager = getRuleManager();
IRuleRuntime ruleRt = ruleManager.newRuntime();
ruleRt.setInput("season", "Winter");
ruleRt.setInput("guestCount", 4);
Map<String, Object> output = ruleManager.executeRule("test/test-table", null, ruleRt);
System.out.println(JsonTool.serialize(ruleRt.getLogMessages(), true));
assertEquals("Roastbeef", output.get("dish"));

具体示例参见 TestRuleExprParser

使用RuleManager嵌入调用的时候可以传入复杂的输入对象,而作为RuleService调用的时候输入变量应该是JSON数据。

1.2 导入模型

在【规则模型】的管理页面上,新增以及修改的时候都可以通过上传Excel模型文件来导入模型定义。

1.3 测试规则

导入规则模型之后,点击行数据上的【测试规则】按钮,可以弹出测试页面。

点击提交按钮之后,会弹出结果显示页,其中包含了返回的输出变量集合,以及规则执行过程中产生的详细日志信息,从中可以看出具体规则节点的匹配顺序和匹配结果

二. 配置

2.1 Excel模型配置

Excel规则模型必须包含两个Sheet,其中Rule表单配置决策规则,而Config表单配置输入输出变量等描述信息。

输入变量是规则模型中用于判断的那些变量,而输出变量是满足匹配条件的那些规则节点所产生的输出。为了支持在线可视化设计,我们需要为输入输出变量指定显示名和数据类型。

输入变量支持复杂对象结构

  1. 在变量名前增加*号可以表示嵌套对象结构,增加几个*号表示对应第几个层级
  2. 通过设置【计算】列为Y,则表示这个属性不是由外部调用者传入的,而是根据输出数据和上下文环境变量动态计算得到的值,计算使用的表达式由【缺省表达式】列指定
  3. 业务规则匹配时有可能会匹配到多个执行分支,每个分支都可能会产生输出变量,通过指定【汇总】列,我们可以指定如何根据综合多个输出结果产生最终返回的output值。

2.2 Rule表达式

在输入列的单元格中配置规则判断表达式RuleExpr,它的语法有些类似Friendly Enough Expression Language (FEEL),是XLang Expression的一个更容易阅读的版本,使用RulExprParser来解析。

  1. true和false可以直接指定是否匹配

  2. 减号-表示true,直接匹配

  3. 数值型表示严格匹配

  4. 引号包裹的字符串表示严格匹配

  5. 如果是单个变量名则不把它作为变量来解释,而是看作是字符串值。如果要表示等于变量,则应该使用 == myVar这种形式

  6. 支持比较操作符和and/or/not,并且支持括号。所有支持比较操作符在FilterOp类中定义

  7. 支持所有XScript中注册的全局函数

2.3 决策表配置

决策表的配置示例可以参见 decision-tree.rule.xlsx

决策表的左上角的内容必须是字母T,表示Table。然后是输入列和输出列。输入列和输出列的每一列都是对应的输入输出变量名。

2.4 决策矩阵配置

决策矩阵的配置示例可以参见 decision-matrix.rule.xlsx

决策表的左上交的内容必须是字母M,表示Matrix。

  1. 在左侧的每一列以及头部的每一行的第一个单元格中可以配置输入变量名。
  2. 单元格中可以通过批注valueExpr来指定表达式,此时单元格文本仅作为显示用的label。如果不配置,则以单元格的文本为表达式。
  3. 可以配置输出多个结果值

2.5 在线修改

对于决策树模型可以通过在线页面进行修改,规则匹配条件的配置使用AMIS的ConditionBuilder控件

三. 设计原理

在Nop平台的整体设计中,NopRule负责的是对复杂判断逻辑的抽象,这其中最核心的部分是Filter模型

3.1 Filter模型

filter模型由filter.xdef元模型来定义,它可以用于描述复杂的and/or条件

<and><or><eq name="status" value="1" /><eq name="status" value="2" /></or><gt name="amount" value="3" />
</and>
  1. Nop平台在所有需要表达判断条件的地方都统一使用Filter模型,在Java程序中对应ITreeBean类型
  2. 利用XML和JSON的双向转换,Filter模型可以保存为XML格式或者JSON格式
  3. Nop平台中高级查询使用的就是Filter模型,后台通过FilterBeanToSQLTransformer类将它转换为SQL语句
  4. 前端AMIS的ConditionBuilder控件可以将复杂判断条件保存为Condition对象。ConditionExprHelper负责实现Condition和Filter模型之间的双向转换。
  5. Filter模型可以通过FilterBeanToPredicateTransformer编译得到IEvalPredicate接口,直接在内存中执行过滤逻辑,
  6. Filter模型也可以通过FilterBeanEvaluator在内存中执行
  7. Filter模型与表达式语言Expression之间可以利用FilterBeanExpressionCompiler和ExpressionToFilterBeanTransformer进行可逆转换,

3.2 Schema模型

Nop平台中所有需要定义对象类型的地方都统一使用schema模型,它由元模型schema.xdef来定义。

  1. XDef元模型和Schema模型之间可以相互转换。XDef用于定义XML结构,而Schema用于定义对象以及JSON结构。
  2. 通过SimpleSchemaValidator可以检查value是否满足schema规范要求
  3. 通过XSchemaToJsonSchema可以将schema对象转换为JSON Schema定义
  4. ConditionSchemaHelper负责将规则模型中的输入变量定义转换为前端ConditionBuilder控件所支持的schema定义。

3.3 Excel数据模型

Nop平台提供了Excel数据模型和Java领域模型对象之间的双向转换,因此无需编程,就可以实现Excel解析以及将对象导出为Excel文件的功能。具体介绍参见excel-import.md

  • NopRule在解析Excel格式的规则模式时,对于Config表单页的解析就是使用的标准Excel转换技术。
 RuleModel rule = ImportModelHelper.parseSheet(sheetModel, configSheet, compileTool, scope, RuleModel.class);
  • NopRule使用Excel格式的API模型来定义对外服务接口,自动生成对应的接口定义和服务框架类,参见nop-rule.api.xlsx

总结

NopRule的实现采用了Nop平台的基本技术战略:

  1. 通过元模型来定义领域模型
  2. 尽量通过自动推导实现模型之间的双向转换,减少硬编码
  3. 通过复用底层的通用模型,如Filter、Expression等,我们可以快速组装出更复杂的领域模型,如规则模型

基于可逆计算理论设计的低代码平台NopPlatform已开源:

  • gitee: canonical-entropy/nop-entropy
  • github: entropy-cloud/nop-entropy
  • 开发示例:docs/tutorial/tutorial.md
  • 可逆计算原理和Nop平台介绍及答疑_哔哩哔哩_bilibili

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

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

相关文章

SpringSecurity + Jwt权限校验,接口调用403 Forbidden问题排查与解决

问题背景&#xff1a;部分接口调用正常&#xff0c;部分接口调用报403Forbidden&#xff0c;postman不显示具体报错信息。 问题描述&#xff1a; 接口调用报错&#xff0c;经排查&#xff0c;权限校验认证通过&#xff0c;可以进入接口&#xff0c;但是在执行过程中&#xff0…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…

webpack 老项目升级记录:从 node-sass 限制的的 node v8 提升至支持 ^node v22

老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步&#xff1a;vue2 升级到最新 第一步&#xff1a;升级 vue2 至最新版本&#xff0c;截止到目前&#xff08;2024-10-…

ATom:加州理工学院化学电离质谱仪(CIT-CIMS)的现场数据,V2版

目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 ATom: In Situ Data from Caltech Chemical Ionization Mass Spectrometer (CIT-CIMS), V2 ATom&#xff1a;加州理工学院化学电离质谱仪&#xff08;CIT-CIMS&#xff09;的现场数据&#xff0c;V2版 简介 该数…

trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案

前言 最近听说truenas的24.10版本开放docker容器解决方案放弃了原来难用的k3s&#xff0c;感觉非常巴适&#xff0c;就研究了一下&#xff0c;首先遇到无法迁移老系统应用问题比较好解决&#xff0c;使用sudo登录ssh临时修改daemon.json重启docker后进行docker start 容器即可…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是&#xff1a;123456&#xff1b; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句&#xff0c;会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

Java设计模式之代理模式(二)

一、CGLIB动态代理 JDK动态代理要求被代理的类必须实现接口&#xff0c;有很强的局限性&#xff0c;而CGLIB动态代理则不要求被代理类实现接口。简单的说&#xff0c;CGLIB会让生成的代理类继承被代理类&#xff0c;并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。…

git的学习之远程进行操作

1.代码托管GitHub&#xff1a;充当中央服务器仓库的角色 2.git远程进行操作 3.配置本地服务器的公钥 4.推送 5.git远程操作 pull .gitignore 6.给命令配置别名 git config --global alias.st status 7.标签管理 git tag -a [name] -m "XXX" [commit_id] 操作标签…

基于Python的自然语言处理系列(46):4-bit LLM 量化与 GPTQ

在本篇文章中&#xff0c;我们将深入探讨如何使用 GPTQ (Generative Pre-trained Quantization) 进行4-bit大语言模型(LLM)的量化。在大规模语言模型训练和推理的背景下&#xff0c;模型的量化不仅能够大大降低计算成本&#xff0c;还能够提高推理速度&#xff0c;因此对构建高…

查找与排序-插入排序

1.直接插入排序的基本思想 假设n个数据元素关键字存储在静态数组a中&#xff0c;则直接插入排序的基本思想可做如下描述&#xff1a; &#xff08;1&#xff09;初始有序子序列由一个元素a[0] 组成&#xff1b; &#xff08;2&#xff09;从a[1]开始&#xff0c;对于序列中每…

leetcode 75-13 k和数对的最大数目

我的思路 sort函数排序 然后双指针判断 这样时间复杂度nlgn 题解给出了一种空间换时间方法 用哈希表 注意一下写法 现在完全不会这样写 还有就是注意sort函数的代码 怎么写排序也给忘了 sort用的是什么排序方法

自由职业者的一天:作为小游戏开发者的真实工作日记

大家好&#xff0c;我是小蜗牛。 在这个快节奏的数字时代&#xff0c;自由职业者的生活往往充满了挑战与机遇。作为一名微信小游戏开发者&#xff0c;我的日常工作并不像人们想象中的那样充满光鲜亮丽的画面&#xff0c;而是由无数的编码、调试和创意碰撞组成的。今天&#xf…

MySQL 回收表碎片实践教程

前言&#xff1a; 在 MySQL 数据库中&#xff0c;随着数据的增删改操作&#xff0c;表空间可能会出现碎片化&#xff0c;这不仅会占用额外的存储空间&#xff0c;还可能降低表的扫描效率&#xff0c;特别是一些大表&#xff0c;在进行数据清理后会产生大量的碎片。本篇文章我们…

Lesson11---stack

Lesson11—stack cstack的介绍使用以及模拟实现 文章目录 Lesson11---stack前言一、stack成员函数1.stack2.empty3.size4. top5.push6.pop 二、stack相关题目1. 最小栈2.栈的压入、弹出序列 三、模拟实现总结 前言 stack的介绍和使用stack是一种容器适配器&#xff0c;专门用…

B+树(B树的改进)

目录 一、什么是B树&#xff1f; 二、B树的性质 1.B树被广泛作为数据库索引的索引结构 2.m个分支的结点有m个元素 3.每个元素对应子结点最大值 4.多级索引结构 5.叶子结点层包含所有元素 三、B树和B树的区别 四、B树的查找 1.顺序查找 2.随机查找 3.范围查找 一、什…

vue3完整Demo(数据绑定,数据显示,数据修改,数据提交)

需要引入的的依赖&#xff1a;jquery&#xff08;用于异步请求&#xff09; 一、数据显示的前端页面 条件查询数据并显示&#xff0c;下拉框使用的model双向绑定 二、js代码&#xff08;list页面的数据请求&#xff09; 后端传来的时间数据需要转换可以使用new Intl.DateTim…

Vue3 学习笔记(七)Vue3 语法-计算属性 computed详解

#1024程序员节|征文# 1、计算属性 computed 在 Vue.js 中&#xff0c;计算属性&#xff08;computed properties&#xff09;是一种特殊的响应式属性&#xff0c;它们根据依赖的响应式数据自动更新。计算属性非常适合用于当你需要根据现有数据派生出一些状态时。 (1)、基本用法…

LLM | 论文精读 | NeurIPS 2023 | SWIFTSAGE: 结合快思考与慢思考的生成智能体

论文标题&#xff1a;SWIFTSAGE: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks 作者&#xff1a;Bill Yuchen Lin, Yicheng Fu, Karina Yang, Faeze Brahman, Shiyu Huang, Chandra Bhagavatula, Prithviraj Ammanabrolu, Yejin Choi, Xian…

【Vue3】第二篇

Vue3学习第二篇 01. 事件处理02. 事件传参03. 事件修饰符04. 数组变化侦测05. 计算属性06. class绑定07. style绑定08. 侦听器09. 表单输入绑定10. 模板引用 01. 事件处理 在vue当中的事件处理和html、css中的不一样&#xff0c;它单独做了处理。 注意&#xff1a;用法中只是用…