采用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…

【MySQL】提高篇—视图与存储过程:存储过程(Procedure)的创建与调用

在关系数据库中&#xff0c;存储过程&#xff08;Stored Procedure&#xff09;是一组预编译的 SQL 语句和可选的控制流语句&#xff08;如条件语句和循环语句&#xff09;&#xff0c;它们被存储在数据库中并可以被客户端应用程序或数据库用户调用。存储过程可以接受输入参数&…

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

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

Java 线程池:深入理解与高效应用

在 Java 并发编程中&#xff0c;线程池是一种非常重要的技术。它可以有效地管理和复用线程&#xff0c;提高系统的性能和资源利用率。本文将深入探讨 Java 线程池的概念、原理、使用方法以及最佳实践&#xff0c;帮助读者更好地理解和应用线程池。 一、引言 在现代软件开发中&a…

高级SQL技巧掌握

高级SQL技巧掌握 在数据驱动的时代,掌握SQL不仅仅是为了解决具体问题,它更像是一把钥匙,帮助你打开数据分析的大门。你准备好提升你的SQL技能了吗?在这篇文章中,我们将一起探索十个必备的高级SQL查询技巧,这些技巧将帮助你更有效率地进行数据处理与分析。 1. 常见表表达…

从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-…

解决RabbitMQ脑裂问题

文章目录 前言一、现象二、解决办法 前言 RabbitMQ脑裂 一、现象 RabbitMQ镜像群出现脑裂现象&#xff0c;各个节点的MQ实例都“各自为政”&#xff0c;数据并不同步。 二、解决办法 # 停止mq sh rabbitmq-server stop_app # 查看mq进程是否存在 ps -ef | grep rabbitmq # …

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;并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。…

二叉树详解:类型、特性与应用

二叉树详解&#xff1a;类型、特性与应用 二叉树&#xff08;Binary Tree&#xff09;是计算机科学和数据结构中的核心构造&#xff0c;广泛用于多种算法和系统的实现。其每个节点最多有两个子节点&#xff0c;即左子节点和右子节点。尽管其结构表面上相对简单&#xff0c;二叉…

在 Gitee 或 GitCode 上克隆 Dify 项目源码并启动 Docker 环境

在 Gitee 或 GitCode 上克隆 Dify 项目源码并启动 Docker 环境 第一步&#xff1a;克隆源码仓库 首先&#xff0c;使用以下命令将项目克隆到本地&#xff0c;确保您已经在 Gitee 或 GitCode 上配置了 SSH 密钥&#xff1a; git clone gitgitcode.com:Mingcai_Xiong/dify-cop…

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;因此对构建高…

正则表达式使用举例一(Python下)

目录 1 问题描述2 解决2.1 问题1的解决2.2 问题2的解决 摘要&#xff1a;本文给出了一个在Python语言中利用re包进行正则表达式匹配计算的例子。详细讲述了所写的正则表达式的含义&#xff0c;还对搜索结果对象的span()函数进行运用举例&#xff0c;从而成功提取出原字符串中的…

查找与排序-插入排序

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

安卓屏幕旋转(TODO)

要对整个安卓系统实现实时旋转&#xff0c;无论设备如何旋转&#xff0c;屏幕始终与设备的物理方向保持一致&#xff0c;涉及到修改 Android 系统级别的显示设置和传感器处理。这种需求不单单在应用层实现&#xff0c;而是需要对 Android 系统的 **frameworks** 和 **display s…

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

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