Drools用户手册翻译——第二章 入门(上)

news2025/1/12 15:53:39

因为篇幅原因,所以分为上下两个部分,主要就是通过一个交通违章项目的例子,带你先粗略感受一下决策模型的使用流程,总体来说有详细,也有没说清的地方,如果想要了解一下决策模型,可以进来了解一下。

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。

 

原文地址:https://docs.drools.org/8.40.0.Final/drools-docs/drools/getting-started/index.html

目录

第一个规则项目

需要的工具

用maven原型创建一个项目

Drools中的角色服务入门

从头开始创建交通违法项目

决策模型

创建交通违法的DMN决策需求图

创建交通违章DMN自定义数据类型

为DRD的输入和决策节点分配自定义数据类型

定义交通违章DMN的决策逻辑


第一个规则项目

这篇指导将带你走过创建一个简单Drools应用项目的过程。

需要的工具

JDK11+环境配置

版本3.8.6+的maven

可选,一个代码编辑器,可以是IDEA,VSCode或者Eclipse

用maven原型创建一个项目

用下面的命令创建一个项目

mvn archetype:generate -DarchetypeGroupId=org.kie -DarchetypeArtifactId=kie-drools-exec-model-ruleunit-archetype -DarchetypeVersion=8.40.0.Final

在命令执行期间,输入项目的属性值

Define value for property 'groupId': org.example
Define value for property 'artifactId': my-project
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' org.example: :
...
 Y: : Y
...
[INFO] BUILD SUCCESS

现在,你的第一个规则项目建好了,让我们进到项目里面去查看一下。

首先,是pom文件

<dependency>
   <groupId>org.drools</groupId>
   <artifactId>drools-ruleunits-engine</artifactId>
</dependency>

对于单元规则用例来说,这是一个必须的依赖。

你可以继续使用传统的drools7风格的规则而不是单元规则。

这个用例里面,使用kie-drools-exec-model-archetype。

原型包含一个DRL文件,如下面的例子所示:

package org.example;

unit MeasurementUnit;

rule "will execute per each Measurement having ID color"
when
        /measurements[ id == "color", $colorVal : val ]
then
        controlSet.add($colorVal);
end

query FindColor
    $m: /measurements[ id == "color" ]
end

这个规则检测传入的Measurement数据,并且当其实颜色信息时,将其值存储在一个全局变量controlSet中 。when的部分实现了模式匹配,then的部分实现了当条件成立时的行为。

下一步,找到src/main/java/org/example/MeasurementUnit.java 该类详细说明了规则里面的单元MeasurementUnit。这个被叫做规则单元,用于对数据源,全局变量和DRL规则进行分组。

public class MeasurementUnit implements RuleUnitData {

    private final DataStore<Measurement> measurements;
    private final Set<String> controlSet = new HashSet<>();

    ...

规则文件rules.drl中的/measurements是绑定到MeasurementUnit中的mensurements属性的字段。所以你知道输入的数据类型是Measurement。这个类也被定义为全局变量controlSet。

然后,src/main/java/org/example/Measurement.java 是规则里面的一个java bean的类。这样的对象被称作Fact。

最后,src/test/java/org/example/Measurement.java是执行规则的测试用例。你可以学习在自己的应用中使用简单的API。

MeasurementUnit measurementUnit = new MeasurementUnit();

RuleUnitInstance<MeasurementUnit> instance = RuleUnitProvider.get().createRuleUnitInstance(measurementUnit);

创建一个Measurement实例,然后用RuleUnitProvider创建一个带有Measurement实例的RuleUnitInstance。

measurementUnit.getMeasurements().add(new Measurement("color", "red"));
measurementUnit.getMeasurements().add(new Measurement("color", "green"));
measurementUnit.getMeasurements().add(new Measurement("color", "blue"));

在measurementUnit.measurements添加Measurement facts。这意味着facts被插入到了Drools规则引擎。

List<Measurement> queryResult = instance.executeQuery("FindColor").stream().map(tuple -> (Measurement) tuple.get("$m")).collect(toList());

执行一个叫做FindColor的查询。当你执行一个查询,将自动启动与插入的facts匹配的规则。如果你指向启动规则,不需要查询,你可以直接调用Instance.fire()。

instance.close();

在最后,调用close方法释放RuleUnitInstance所持有的资源。

让我们用mvm clean test命令去运行一下测试程序。

[INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running org.example.RuleTest 2022-06-13 12:49:56,499 [main] INFO Creating RuleUnit 2022-06-13 12:49:56,696 [main] INFO Insert data 2022-06-13 12:49:56,700 [main] INFO Run query. Rules are also fired [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.411 s - in org.example.RuleTest

现在你可以添加自己的规则和facts到项目里面去了。

规则项目需要在通过mvn编译阶段生成代码。如果你直接在IDE里面运行RuleTest.java,你可能需要先运行一下mvn compile命令。

Drools中的角色服务入门

作为一个业务规则的开发者,你可以使用Drools设计各种各样的决策服务。这篇文章基于 从Kogito Examples GitHub repository(https://github.com/kiegroup/kogito-examples/tree/stable/kogito-quarkus-examples/dmn-quarkus-example)获得的Traffic_Violation样例工程描述了如何去创建并测试一个交通违章的例子。这个样例项目使用决策模型去定义司机在交通违章中的处罚。你可以根据本文档的步骤去建立一个项目和其包含的文件等,或者打开查看已经创建好的Traffic_Violation的示例项目。或者,你可以直接跳到项目评估部分,方法是从上面的连接中本地查看现成的Traffic_Violation示例项目,然后跳到 Evaluating the traffic violations DMN model with Drools(使用Drools评估交通违法DMN模型)(地址:https://docs.drools.org/8.40.0.Final/drools-docs/drools/getting-started/index.html#gs-evaluating-dmn_getting-started-decision-services)部分。

为了得到更多Drools中DMN模块和实现的信息,可以参考DMN Engine in Drools section(https://docs.drools.org/8.40.0.Final/drools-docs/drools/getting-started/index.html#dmn-con_dmn-models).

先决条件

  • 有一个明确的部署平台。例如使用drools所谓java的依赖,或者使用在云原生平台上使用Kogito。

  • 满足部署平台的先决条件。

  • 在遵循被教程的同时,考虑部署平台的部署过程。

从头开始创建交通违法项目

在IDE中创建一个名为traffic-violation的项目。该项目包含很多素材,例如数据对象,DMN素材,和测试方案。你创建的样例工程和已经存在的Traffic_Violation样例工程,是相似的

根据你使用的IDE和下面的介绍,创建一个基于mavne的KJAR项目。

决策模型

决策模型是由OMG为了描述和建模而建立的一套标准。DMN定义了一套XML的模型,该模式可以让DMN模型在符合DMN模式的平台之间甚至跨越组织去分享,以便让业务分析师和业务规则开发人员在设计与实现DMN决策服务时进行合作。DMN标准和为了设计与建立业务模型过程的BPMN标准相似的标准,并且能够一起使用。

想要获取更多关于DMN背景和应用的信息,请看 Drools DMN landing page

(https://www.drools.org/learn/dmn.html).

创建交通违法的DMN决策需求图

决策需求图是你的DMN模型的视觉表示。使用KIE DMN便捷器去为交通违法项目设计决策需求图,并且决策需求图组件的决策逻辑。

 图示1.交通违法示例的DRD

先决条件

你已经用Drools建立了一个交通违法项目。

过程

  1. 在交通违法项目的首页,点击添加Asset。
  2. 在Add Asset页面,点击DMN。创建新的DMN窗口会被打开。                                              a.在创建新DMN窗口中,在DMN的name属性里面输入Traffic Violation .                               b.从Package列表里面,选择com.myspace.traffic_violation.                                                  c.点击OK。 DMN设计器里面的DMN素材就会被打开。
  3. 在DMN设计板上,拖两个DMN输入数据点到画布上。图示2. DMN输入数据点
  4. 在右上角点击 编辑 icon。
  5. 双击输入点并且对其中一个重命名为Driver,另一个重命名为Violation。
  6. 拖一个DMN Decision决策点到画布上。
  7. 双击决策节点并且重命名为Fine
  8. 点击Violation输入节点,选择Create DMN Information Requirement图标,并且点击Fine决策节点去连接这两个节点。                                  图示3.Create DMN Information Requirement图标
  9. 拖一个DMN Decision决策节点到画布上。
  10. 双击决策节点,重命名为Should the driver be suspended?
  11. 点击Driver输入节点,选择 Create DMN Information Requirement图标连接Should the driver be suspended?决策节点
  12. 点击Fine决策节点,选择 Create DMN Information Requirement图标,选择Should the driver be suspended?决策节点。
  13. 点击保存

注意:当你定期地保存DRD时,DMN设计者会对DMN模型进行验证,并且在模型完全定义之前,可能会产生错误的信息。在你完成DMN定义之后,如果还有错误,需要对指定的问题进行故障排除。

创建交通违章DMN自定义数据类型

DMN数据类型决定了在DMN装箱表达式中的表、列或字段中用于定义决策逻辑的数据的结构。你可以使用默认的数据类型(像String,Number或者Boolean),也可以使用自定义的数据类型,去指定你想实现装箱表达式值的属性和约束。使用KIE DMN编辑器的数据类型Tab为交通违章项目,定义自定义数据类型。

 图示4.自定义数据类型tab

创建下面的表列表tDriver,tViolation和tFine自定义数据类型.

NameType
tDriverStructure
Namestring
Agenumber
Statestring
Citystring
Pointsnumber
NameType
tViolationStructure
Codestring
Datedate
Typestring
Speed Limitnumber
Actual Speednumber
NameType
tFineStructure
Amountnumber
Points

number

先决条件:

你用KIE DMN编辑器创建了交通违章DMN决策需求表

过程

1.创建自定义数据tDriver,在Data Types tab页里点击Add a custom Data Type,在name属性栏里输入tDriver,在Type列表里面选择Structure。

2.单击New Data Type右侧的复选框来保存你的更改。

3.通过点击tDriver旁边的加号,添加下列属性到tDriver数据结构中。点击每一个新数据类型右侧的复合按钮保存更改。

        Name(string)

        Age(number)

        State(string)

        City(string)

Points(number)

4.创建自定义数据tViolation,点击New Data Type,在Name属性中输入tViolation,在Type列表里面选择Structure。

图示6. 自定义数据类型tViolation

6.通过点击tViolation旁边的加号,添加下列属性到tViolation数据结构中。点击每一个新数据类型右侧的复合按钮保存更改。

        Code(string)

        Date(date)

        Type(string)

        Speed Limit(number)

        Actual Speed(number)

7.在嵌套数据类型Type里添加下列约束,点击编辑图标,点击添加约束,在Select constraint type下拉菜单里选择Enumeration。

        Speed

        Parking

        Driving under the influence

8.点击OK,然后点击Type数据类型右侧的复选框保存你的修改。

9.创建自定义数据tFine,点击New Data Type,在Name属性中输入tFine,在Type列表里面选择Structure,点击保存。

 图示7. 自定义数据类型tFine

10.通过点击tFine旁边的加号,添加下列属性到tFine数据结构中。点击每一个新数据类型右侧的复合按钮保存更改。

        Amount(number)

        Points(number)

11.点击Save。

为DRD的输入和决策节点分配自定义数据类型

在创建DMN自定义数据类型之后,将这些自定义数据分配给交通违章DRD里面的DMN输入节点和DMN决策节点。

先决条件:

在KIE DMN编辑器里面已经创建了交通违章DMN自定义数据类型。

过程:

  1. 单击DMN 设计者的Model菜单的tab页,单击DMN设计者的右上角的属性图标,导出DRD的属性。

  2. 在DRD中,选择Driver输入节点并且在Properties 面板的数据类型下拉菜单里面选择tDriver。

  3. 选择Violation输入节点并且在Properties 面板的数据类型下拉菜单里面选择tViolation。

  4. 选择Fine输入节点并且在Properties 面板的数据类型下拉菜单里面选择tFine。

  5. 选择Should the driver be suspended? 决策节点并且设置如下属性

    1. 数据类型:string

    2. 问题:Should the driver be suspended due to points on his driver license?

    3. 允许的回答:Yes,No

  6. 单击保存。

至此,你已经将自定义数据类型分配给了DRD的输入和决策节点。

定义交通违章DMN的决策逻辑

计算罚款和决定是否没收驾照,你可以用DMN决策表和上下文的装箱表达式去定义交通文章的DMN决策逻辑。

 图示8 罚款表达式

 图示9 司机是否被没收驾照表达式

 

先决条件

已经用KIE DMN编辑器将DMN的自定义数据类型分配给了交通违章DRD中的合适的决策和输入节点。

过程

1.计算罚款,在DMN设计者画布中,选择Fine决策节点,单击边界图标打开DMN装箱表达式的设计器。

 图示10 决策节点的编辑图标

2.单击Select expression-> Decision Table

 图示11 选择Decisiong Table的逻辑类型

 

3.对于Violaation的Date,Violation的Code和Violation的Speed limit列,右击并选择删除。

4.单击Violation的Actual Speed列并且在表达式属性中输入表达式Violation.Actual Speed - Violation.Speed Limit

5.在决策表的第一行中输入下列值

        Violation.Type:"speed"

        Violation.Actual Speed - Violation.Speed Limit:[10..30)

        Amount:500

        Points:3

        右击第一行并选择Insert below添加另外一行。

6.在第二行输入下列值

        Violation.Type:"speed"

        Violation.Actual Speed - Violation.Speed Limit:>=30

        Amount:1000

        Points:7

        右击第二行并选择Insert below添加另外一行。

7.在第三行输入下列值

        Violation.Type:"parking"

        Violation.Actual Speed - Violation.Speed Limit:-

        Amount:100

        Points:1

        右击第三行并选择Insert below添加另外一行。

 

8.在第四行输入下列值

        Violation.Type:"driving under the influence"

        Violation.Actual Speed - Violation.Speed Limit:-

        Amount:1000

        Points:5

9.单击Save

10.定义没收驾照规则,返回DMN设计器画布,选择Should the driver be suspended? 决策节点,单击编辑图标打开DMN装箱表达式设计器。

11.单击Select expression -> Context.

12.单击ContextEntry-1,输入Total Points作为name,从数据类型的下拉菜单里选择number。

13.单击Total Points旁边的单元格,从上下文菜单选择 Literal experssion,输入Driver.Points + Fine.Points作为表达式。

14.单击Driver.Points + Fine.Points 的下一格,在上下文菜单选择Literal Experssion,输入if Total Points >= 20 then "Yes" else "No"。

15.点击保存。

至此,你已经定义了如何罚款和决策何时没收司机驾照的决策上下文。你可以导航到交通违章项目页面,点击Build按钮构建例子项目,并解决记录在警告面板中的错误。

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

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

相关文章

试用有奖:在线试用stable diffusion 模型生成优质人物好图

一、活动介绍 InsCode是一个集成了在线IDE、在线AI编程、在线算力租赁、在线项目部署以及在线SD 模型使用的综合代码开发平台。不论你是初级软件工程师&#xff0c;还是AI大模型爱好者&#xff0c;InsCode都能帮助你快速编写代码&#xff0c;运行项目。甚至在这里你还可以一键…

某平台登录之电话号码加密

抓包 POST /******/common/****** HTTP/1.1 Host: ****** Content-Type: application/json; charsetUTF-8 Host: ****** User-Agent: okhttp/3.14.9{"type":"login","apor":"******************"}加密 由于信息原因就不泄露了 此处只…

Linux系统编程:进程的创建、终止和替换

目录 一. 进程创建 1.1 fork函数的使用 1.2 fork函数的底层实现 1.3 子进程创建的写时拷贝问题 二. 进程的退出 2.1 进程退出的场景和方法 2.2 exit和_exit函数 三. 进程的等待 3.1 为什么要有进程等待 3.2 进程等待的方法 3.2.1 进程等待的相关函数 3.2.2 进程的阻…

JS知识点汇总(六)--作用域链this

1. 什么是作用域链&#xff1f; 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性 1. 作用域分类 一般将作用域分成&#x…

TDengine 发布 IoT 场景下 3.0 性能对比分析报告,全方位超越 InfluxDB TimescaleDB

6 月 26 日&#xff0c;涛思数据旗下时序数据库&#xff08;Time Series Database&#xff09; TDengine 正式发布 IoT 场景下 TDengine 3.0 性能对比分析报告&#xff0c;该报告在 IoT 场景下从数据写入、压缩和查询等维度&#xff0c;对比了 TDengine 与市场其他流行的时序数…

Linux系统安装QQ最新版

腾讯在2023-05-30更新了linux版的qq&#xff0c;这次界面终于不再复古&#xff0c;好看多了。 安装步骤&#xff1a; 1.进入官网&#xff0c;寻找合适的安装包下载 https://im.qq.com/linuxqq/index.shtml 选择跟自己计算机匹配的版本&#xff0c;一般都是X86&#xff0c;如…

VMware共享文件夹

当虚拟机需要使用宿主机里的文件时&#xff0c;就需要在虚拟机设置里添加共享文件夹&#xff0c;大概过程如下&#xff1a; 虚拟机设置&#xff1a; 在centos里&#xff0c;完成上述操作后会生成一个目录 /mnt/hgfs 宿主机里的文件就在这个目录里可以看到并使用了。

编译linux内核(二)

编译linux内核 1. 准备工作1.1 下载内核文件1.2 环境准备1.3 内核命名规则 2. 编译内核2.1 升级gcc2.2 make menuconfig其他报错2.3 配置选项2.4 编译内核2.5 安装模块2.6 安装内核2.7 验证内核 3. 制作内核文件3.1 创建磁盘文件3.2 磁盘分区3.3 将磁盘分区关联到/dev/loop7设备…

化学理论知识vr沉浸式教学软件推动立足“学生老师双主体”一体化的教学模式改革

VR虚拟仿真是基于虚拟现实、3D技术、计算机技术等搭建起来的一套具有数字化、智慧化的智能教学系统&#xff0c;它以学生学习为中心&#xff0c;探索学科内容&#xff0c;使用VR虚拟现实将学科内容以3D立体化形式呈现&#xff0c;培养学生的思维创新、实操技能。 VR虚拟仿真技术…

【数据库基础】Mysql基本概念讲解与实操

文章目录 数据库基础服务器&#xff0c;数据库&#xff0c;表关系Mysql的架构Sql分类 库的操作修改默认的编码格式两种校验修改数据库删除数据库备份和恢复观察用户&#xff0c;查看连接 表的操作修改表字段长度删除某一列修改表名修改列名称 数据类型小数类型floatdecimal字符…

Hystrix

一、Hystrix(豪猪)简介 1、Hystrix的设计目的 &#xff08;1&#xff09;对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护。 &#xff08;2&#xff09;阻止某一个依赖服务的故障在整个系统中蔓延&#xff0c;服务A->服务B->服务C&#xff0c;服务C故障了…

MySQL - Delete 和 Truncate 的区别

1. DELETE 命令 语法 &#xff1a; delete from 表名 [where 条件] -- 删除数据 (避免这样写, 会全部删除) DELETE FROM student;-- 删除指定数据 DELETE FROM student WHERE id 1; 2. TRUNCATE 命令 作用 : 完全清空一个数据库表, 表的结构和索引约束不会变. -- 清空 stu…

大体积mbtiles影像地图文件用什么软件浏览?

mbtiles格式简称mbt&#xff0c;是一种影像地图文件。PC端和手机端都有软件可以加载留着mbt格式的影像地图。 电脑桌面端 电脑端上的软件可以使用“图新地球”&#xff0c;直接把mbt文件拖到地图上即可&#xff0c;非常简便。 手机端 可以从华为应用商店下载“外业精灵”app…

Meta提出用向量检索来改进图像描述模型

出品人&#xff1a;Towhee 技术团队 作者&#xff1a;王翔宇 顾梦佳 随着深度神经网络的发展&#xff0c;自动图像描述技术取得了令人瞩目的进展。然而&#xff0c;现有的方法主要注重生成的描述与人类参考描述之间的相似性&#xff0c;却忽视了描述在实际应用中的特定目标。Me…

用户体验测试要怎么做?

用户体验测试是软件和应用程序开发的关键环节&#xff0c;它可以帮助团队了解如何优化产品以提高用户满意度&#xff0c;那用户体验测试要怎么做&#xff1f;下面是一些进行用户体验测试的最佳实践&#xff1a; 制定测试计划 在进行用户体验测试之前&#xff0c;您需要制定测试…

【Gradio】Could not create share link

Gradio是MIT的开源项目&#xff0c;用于构建机器学习和数据科学演示和 Web 应用&#xff0c;挺有意思的&#xff0c;感兴趣的同学可以去Gradio官网查看。 本地环境&#xff1a; - OS: Win 11 - Pyton: 3.10.11 - Gradio: 3.29.0 Gradio库的安装(Python 需要3.7 版本): - pip …

6.5 指令与文件的搜寻

6.5.1 指令文件名的搜寻 在终端机模式当中&#xff0c;连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。 which &#xff08;寻找“可执行文件”&#xff09; 这个指令是根据“PATH”这个环境变量所规范的路径&#xff0c;去搜寻“可执行文件”的文件名。所以&…

iOS distribution发布证书过期或者被手动revoke了app会被下架吗?

在距离distribution 证书过期一个月&#xff08;或被手动revoke了&#xff09;的时候会受到apple的邮件 虽然distribution过期&#xff08;或者被手动revoke&#xff09;了&#xff0c;如果你的开发者账号是company&#xff08;公司&#xff09;类型或个人类型的&#xff0c;只…

LDR6023Q在USB摄像头转接器的应用

最近USB摄像头火了起来&#xff0c;连接手机后可以用于直播&#xff0c;内窥镜&#xff0c;探鱼器&#xff0c;上网课等等&#xff0c;应用非常广泛&#xff0c;但在长时间连接手机的时候&#xff0c;电量消耗特别快&#xff0c;所以USB摄像头转接器应运而生。 USB摄像头转接器…

多元回归预测 | Matlab海鸥算法(SOA)优化极限学习机ELM回归预测,SOA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海鸥算法(SOA)优化极限学习机ELM回归预测,SOA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环…