决策树和规则引擎 (Drools)

     2023-02-19     147

关键词:

【中文标题】决策树和规则引擎 (Drools)【英文标题】:Decision trees and rule engines (Drools) 【发布时间】:2011-06-20 17:20:33 【问题描述】:

在我现在正在处理的应用程序中,我需要定期检查数以万计的对象是否符合某种服务的要求。决策图本身采用以下形式,略大:

在每个末端节点(圆圈)中,我需要运行一个操作(更改对象的字段、日志信息等)。我尝试使用 Drool Expert 框架,但在这种情况下,我需要为图中通向终端节点的每条路径编写一个长规则。 Drools Flow 似乎也不是为这样的用例而构建的——我取一个对象,然后,根据沿途的决定,我最终到达一个末端节点;然后再次为另一个对象。或者是吗?您能给我一些此类解决方案的示例/链接吗?

更新:

Drools Flow 调用可能如下所示:

// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();

for(int i = 0; i < 10000; i++) 

    Application app = somehowGetAppById(i);

    // insert app into working memory
    FactHandle appHandle = ksession.insert(app);

    // app variable for action nodes
    params.put("app", app);

    // start a new process instance
    ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
    while(true) 
        if(instance.getState() == instance.STATE_COMPLETED) 
            break;
        
    

  // remove object from working memory
    ksession.retract(appHandle);

也就是说:我会获取一个 Application 对象,为它启动一个新进程,当进程完成时(最终的操作节点会以某种方式修改应用程序),我会从工作内存中删除该对象并重复一个新的 App 对象的过程。您如何看待这个解决方案?

解决方案: 我最终使用了 Drools Flow,它工作得很好。我的决策过程并不像 Drools Expert 所要求的那样简单,并且取决于决策树中的哪个过程需要从数据库中加载对象列表、转换它们、做出决策、记录所有内容等。我使用 Process 对象它作为参数传递给进程并存储我的所有全局变量(用于进程)和一些在树中不同点重复的便捷方法(因为在Script Task 节点中编写 Java 代码本身不是很方便)。我最终还使用 Java 来做出决定(而不是 mvel 或规则)——它更快,我会说更容易控制。我使用的所有对象都作为参数传递,并在代码中用作普通 Java 变量。

【问题讨论】:

【参考方案1】:

我有一个类似的问题,并使用 Neo4J 节点数据库作为一个简单且非常灵活的规则引擎。 您可以将它与 REST 服务接口一起使用,因此它独立于主应用程序。 您还可以有一个单独的应用程序来配置规则(甚至由最终用户)。

【讨论】:

【参考方案2】:

Drools 专家绝对是必经之路。

如果您想避免在更高的节点上重复自己,那么诀窍是使用insertLogical(或者如果您处于无状态会话中,则只需使用insert)并了解规则可以触发规则(它不是你父亲的 SQL 查询)。例如:

// we just insert Customer objects in the WM

rule "evaluateRetired"
when
    $c : Customer(age > 65)
then
    insertLogical(new Retiree($c));
end

rule "evaluteRetireeIsFemale"
when
    $r : Retiree(customer.gender == Gender.FEMALE, $c : customer)
then
    ...
end

如果决策图经常更改(并且您希望非程序员编辑它),请查看关于决策表(和DSL)的文档。在这种情况下,您可能会为每个规则重复整个路径,但在大多数情况下这实际上是可以的。

【讨论】:

此外,随着决策树的增长,您可能会发现一些终端节点共享操作(例如,所有退休人员都需要获得养老金,与他们的性别无关)并且重新声明它是低效的每个端节点的操作。 Drools Flow 怎么样?我可以使用它对决策树进行建模,然后我可以将一个对象放入工作内存,启动进程并让它决定取哪个结束节点,然后取出对象,放入另一个对象,再次启动它等等?这不是更清晰的解决方案吗? Drools Flow 没有意义。并不是说它不起作用,但是由于您正在做出决定,因此使用规则引擎实现的决策表感觉更加合乎逻辑/自然。试图将其融入工作流是很奇怪的:工作流是长期存在的,每个节点都是一个状态。 看一下drools参考手册中的“决策表”:downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/…你可能不想从XLS开始,而是直接使用DRL,但是你的规则设计是一样的: 每条规则都是一条决策线。 决策表是一个不错的功能。但是,在我的决策树中,有时有不止一种方法可以到达特定的末端节点,如果我用规则重写它,它们的数量会增长得非常快。此外,在图表发生变化的情况下更新规则将是一项相当乏味的任务。因此,在我看来,树/图表(即使在 Drools Flow 中)是一种更自然的方式来表示决策。【参考方案3】:

你可以试试iLog框架兼规则引擎。

【讨论】:

谢谢,但 iLog 似乎不必要地复杂。我正在寻找更精简的解决方案。 基于 JSR 94 的 Java 规则引擎 API 怎么样?还有一个叫杰斯。您可以在此链接中找到列表:java-source.net/open-source/rule-engines 你会遇到同样的设计问题。切换规则引擎实现将无济于事。 Drools 实现了 JSR-94,但 JSR-94 API 对于大多数实际用例来说过于局限。它已经多年没有发展了。

规则引擎drools在贷后催收业务中的应用

...日常业务开发工作中我们经常会遇到一些根据业务规则做决策的场景。为了让开发人员从大量的规则代码的开发维护中释放出来,把规则的维护和生成交由业务人员,为了达到这种目的通常我们会使用规则引擎来帮助我们实现。... 查看详情

开源业务规则引擎jbossdrools

...展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。http://www.tuicool.com/articles/3EFNV3M 查看详情

规则引擎drools示例:个人所得税计算器信用卡申请保险产品准入规则(代码片段)

...卡申请1.2.1计算规则1.2.2实现步骤1.3保险产品准入规则1.3.1决策表1.3.2规则介绍1.3.3实现步骤一、Drools实战1.1个人所得税计算器本小节我们需要通过Drools规则引擎来根据规则计算个人所得税,最终页面效果如下:1.1. 查看详情

将drools引导决策表编译成规则

】将drools引导决策表编译成规则【英文标题】:Compiledroolsguideddecisiontableintorules【发布时间】:2015-08-0309:46:42【问题描述】:我想知道如何使用Drools运行时在Java应用程序中使用DroolsWorkbench中的引导决策表。这个想法是,用户将在... 查看详情

drools规则引擎一文读懂(代码片段)

目录一、Drools简介电商平台的促销活动规则引擎Drools简介二、Drools快速入门 电商平台促销积分规则开发实现三、Drools规则引擎构成及其核心类Drools规则引擎构成Drools规则引擎概念四、Drools基础语法规则文件构成 规则体语法结... 查看详情

java规则引擎drools急速入门

文章目录​​1.Drools规则引擎简介​​​​2.DroolsAPI开发步骤​​​​3.SpringBoot整合Drools案例​​​​4.Drools基础语法​​​​5.Drools条件语法部分​​​​6.Drools结果操作部分​​​​7.Drools内置属性部分​​​​8.Drools高级语法... 查看详情

.netrulesengine规则引擎使用(代码片段)

...#xff0c;是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。比较常见的业务规则... 查看详情

规则引擎drools介绍使用及springboot整合drools(代码片段)

规则引擎Drools介绍、使用及SpringBoot整合Drools一、Drools介绍1.1优点1.2架构1.2.1Drools引擎的核心组件1.2.2规则引擎工作流程简述1.3Drools语法1.3.1规则文件1.3.1.1.规则详情1.属性详情2.条件部分-LHS3.结果部分-RHS1.3.1.2Drools关键词1.3.1.3Drools... 查看详情

数据驱动规则引擎 - Drools

】数据驱动规则引擎-Drools【英文标题】:DataDrivenRulesEngine-Drools【发布时间】:2013-08-2322:51:57【问题描述】:我一直在评估Drools作为我们的业务Web应用程序中使用的规则引擎。我的用例是一个订单管理应用程序。规则如下:-如果... 查看详情

java规则引擎--drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。 本文所使用的demo已上传 http... 查看详情

drools规则引擎环境搭建(代码片段)

一、关于drools规则引擎前面写过一篇Drools规则引擎相关的文章,这篇文章主要记录一下规则引擎的环境搭建和简单示例。不熟悉drools的朋友可以看看这篇文章:自己写个Drools文件语法检查工具——栈的应用之编译器检测语法错误... 查看详情

drools源于规则引擎

...前言     最早对Drools感兴趣,是起源于规则引擎.当时是希望能找一个开源工具来做一些规则的处理.     在官方网站上翻了半天资料,却发现Drools一直在强调它不只是一个简单的规则引擎,而是更... 查看详情

drools规则引擎brms

安装说明|Drools中文网http://www.drools.org.cn/category/installDrools规则引擎-在微服务中的应用-简书https://www.jianshu.com/p/887ff9021eb3Drools规则引擎-在微服务中的应用-简书https://www.jianshu.com/p/887ff9021eb3微服务组件-规则引擎-Fx_demon-OSCHINAhttps://my... 查看详情

springboot+drools规则引擎整合

...gBoot项目的很少。本文介绍如何在SpringBoot项目上加上Drools规则引擎。POM依赖POM文件如下:<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta 查看详情

如何快速学习 Drools 或其他规则引擎 [关闭]

】如何快速学习Drools或其他规则引擎[关闭]【英文标题】:howtolearnDroolsoranotherruleenginefast[closed]【发布时间】:2011-02-0602:08:03【问题描述】:我们正在着手开发一个模块,该模块将根据某些标准生成一些建议。标准将采用一组业... 查看详情

规则引擎drools的简单使用

规则引擎适用于有复杂多变的规则,如商品满减、积分赠送、考勤规则等一、引入maven依赖<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.13.0.Final</version></de 查看详情

springboot2整合drools规则引擎,实现高效的业务规则

...这里一、Drools引擎简介1、基础简介Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。... 查看详情

规则引擎调研(drools和qlexpress)

参考技术A1.问题分析目前存在比较多的判断规则。而且分支逻辑过多,经常出现一些规则判断出现的数据问题。所以需要抽取一些规则条件。利用框架避免问题异常的出现2.框架调研目前常用的规则引擎如下:•常见的规则引... 查看详情