规则引擎-drools-3.3-drl文件构成-rule部分-条件Condition

news2025/1/11 23:43:24

文章目录

  • drl文件构成-rule部分
    • 条件部分 LHS
        • 模式(Pattern)、绑定变量
        • 属性约束
          • DRL中支持的规则条件元素(关键字)
          • 运算符
          • 比较操作符
        • 条件元素继承
        • 条件元素do对应多then条件

drl文件构成-rule部分

drl文件构成,位于官网的第5章位置,也是drools作为规则引擎应用的最核心部分。
其中rule模块,包括属性(Attribute - rule)、条件(Condition - when)、结果(Action - then)是5.1.7、5.1.8、5.1.9 三小节部分内容。

  1. Rule Language Reference
    官网链接:https://docs.drools.org/7.73.0.Final/drools-docs/html_single/index.html#_droolslanguagereferencechapter

条件部分 LHS

when和then中间的部分为条件部分,可以为空,为空时,相当于 eval( true )
在这里插入图片描述

模式(Pattern)、绑定变量

模式(pattern) 也叫类型约束
举例:

Person( age == 50 )

// This is the same as the following getter format:

Person( getAge() == 50 )

Person是我们定义的一个实体对象,如果在条件中出现了类似这样的实体对象,说明该条件匹配的前提条件是session内存中存在Person类型的对象,且属性age == 50. 类似Person 这样的实体对象, 在drools中叫做 Fact。

即代码中要这样才能触发该规则:

Person person = new Person();
person.setAge(50);
kieSession.insert(person);

绑定变量:将模式赋值给变量,可以把整个fact对象赋值变量,也可以将某个属性赋值变量,$变量名: fact对象,或 $变量名:属性,示例如下:

// 整个person对象赋值给 $p,之后这个$p可以直接使用
rule "simple rule"
  when
    $p : Person()
  then
    System.out.println( "Person " + $p );
end
// age属性赋值给变量,这个规则需要两个person实例
rule "simple rule 1"
  when
	// Two persons of the same age:
	Person( $firstAge : age ) // Binding
	Person( age == $firstAge ) // Constraint expression
  then
    System.out.println( "firstAge " + $firstAge );
end

更多模式及绑定变量使用方式官网有非常明确的说明,这里列举几个:

// Do not use the following format:
Person( $a : age * 2 < 100 )

// Use the following format instead:
Person( age * 2 < 100, $a : age )

Person( $a : (age * 2) )
// Example pattern to access multiple properties
Person( name == "mark", address.city == "london", address.country == "uk" )
// Example pattern with grouped constraints
Person( name == "mark", address.( city == "london", country == "uk") )

// Example patterns with inline casting to a subtype
	// Inline casting with subtype name:
	Person( name == "mark", address#LongAddress.country == "uk" )
	
	// Inline casting with fully qualified class name:
	Person( name == "mark", address#org.domain.LongAddress.country == "uk" )
	
	// Multiple inline casts:
	Person( name == "mark", address#LongAddress.country#DetailedCountry.population > 10000000 )
// 判断类型
Person( name == "mark", address instanceof LongAddress, address.country == "uk" )

属性约束

DRL中支持的规则条件元素(关键字)

在这里插入图片描述

DRL中支持的规则条件元素(关键字)

这部分在初接触drools的时候几乎不用。最常用的是and /or/exists。另外eval,当无条件时,相当于 eval(true).
这部分描述的是条件与条件直接的关系,也就是pattern与pattern之间的关系。

其他的作者目前没有示例进行讲解,由于时间关系暂时略过,若后续有时间详细做示例后回来补充。可直接官网查看,内容位于5.1.8.8.

运算符

在这里插入图片描述
运算符这小节内容很少,也是我自己总结的单独列出来了,是规则条件或结果中的属性的运算符,与java相似。

比较操作符

在这里插入图片描述

  1. </>/=/!=/&&/||等 这些与java比较操作符一样。
  2. 字符串比较
    matches, not matches,匹配的是正则表达式
    str[startsWith],str[endsWith],str[length],是以…开头、以…结尾、字符串长度的比较。
    以…开头/以…结尾使用 matces可以实现。
  3. 集合比较
    contains , not contains:也可以比较字符串是否包含(字符串是字符的集合)
    memberof, not memberof:后跟的集合内容必须是一个变量,即需要先将要比较的内容赋值给某个$开头的变量。
    in, notin:第二个操作数必须是一个逗号分隔的值列表,用括号括起来。

附一个官网的比较操作符运算优先级
在这里插入图片描述

条件元素继承

rule "Give 10% discount to customers older than 60"
  when
    $customer : Customer( age > 60 )
  then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
  when
    $customer : Customer( age > 60 )
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
end

使用继承,则以上以上两个规则这样写,适合条件较多的继承方式:

rule "Give 10% discount to customers older than 60"
  when
    $customer : Customer( age > 60 )
  then
    modify($customer) { setDiscount( 0.1 ) };
end

rule "Give free parking to customers older than 60"
    extends "Give 10% discount to customers older than 60"
  when
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
end

条件元素do对应多then条件

这部分既是条件部分内容也涉及结果部分,当条件部分满足 1 时,对应结果处理,满足2时对应结果处理不同等。即一个规则,可能有多种处理结果。

官网示例如下(该例子,是以上两个规则的合并版):
即,当满足客户年龄 > 60时,setDiscount( 0.1 ),
满足 客户年龄 > 60 且 车的所有者是该客户时,setFreeParking( true )

rule "Give 10% discount and free parking to customers older than 60"
  when
    $customer : Customer( age > 60 )
    do[giveDiscount]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount]
    modify($customer) { setDiscount( 0.1 ) };
end

升级版:

rule "Give free parking and 10% discount to over 60 Golden customer and 5% to Silver ones"
  when
    $customer : Customer( age > 60 )
    if ( type == "Golden" ) do[giveDiscount10]
    else if ( type == "Silver" ) break[giveDiscount5]
    $car : Car( owner == $customer )
  then
    modify($car) { setFreeParking( true ) };
  then[giveDiscount10]
    modify($customer) { setDiscount( 0.1 ) };
  then[giveDiscount5]
    modify($customer) { setDiscount( 0.05 ) };
end

此示例规则为60岁以上的Golden客户提供10%的折扣和免费停车,但为Silver客户提供5%的折扣而不提供免费停车。

该规则使用关键字break而不是do激活名为giveDiscount5的结果。

关键字do在Drools引擎议程中安排一个结果,使规则条件的剩余部分能够继续求值,而break则阻止任何进一步的条件求值。

如果一个命名的结果与任何带有do的条件都不对应,而是用break激活,则规则将无法编译,因为永远无法达到规则的条件部分。

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

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

相关文章

工程师是怎样对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师&#xff0c;亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践&#xff0c;也看到了很多 Bad Cases&#xff0c;所以想把自己的一些心得体会写在这里&#xff0c;供工程师进行…

递归、dfs、回溯、剪枝,一针见血的

一、框架&#xff1a;回溯搜索的遍历过程&#xff1a;回溯法⼀般是在集合中递归搜索&#xff0c;集合的⼤⼩构成了树的宽度&#xff0c;递归的深度构成的树的深度。for循环就是遍历集合区间&#xff0c;可以理解⼀个节点有多少个孩⼦&#xff0c;这个for循环就执⾏多少次。back…

那些提升工作效率的Windows常用快捷键

那些提升工作效率的Windows常用快捷键 前言 在我们日常工作中&#xff0c;掌握一些常用的电脑快捷键&#xff0c;可以让办公效率事半功倍&#xff0c;熟用快捷键可以极大增加我们的工作效率&#xff0c;更重要的是键盘操作看起来更让人赏心悦目&#xff01; 我们通常将快捷键…

【C++】作用域与函数重载

【C】作用域与函数重载 1、作用域 1.1 作用域的作用 作用域——scope 通常来说&#xff0c;一段程序代码中所用到的名字并不总是有效/可用的&#xff0c;而限定这个名字的可用性的代码范围就是这个名字的作用域。 简单来说&#xff0c;作用域的使用减少了代码中名字的重复冲…

13、稀疏矩阵

目录 一、稀疏矩阵的生成 1.利用sparse函数建立一般的稀疏矩阵 2.利用特定函数建立稀疏矩阵 二、稀疏矩阵的运算 一、稀疏矩阵的生成 1.利用sparse函数建立一般的稀疏矩阵 稀疏矩阵指令的调用格式&#xff1a; 示例1&#xff1a;输入一个稀疏矩阵 Asparse([1 2 3 4 5],[…

教你一招完美解决 pptx 库安装失败的问题

上一篇&#xff1a;Python的序列结构及常用操作方法&#xff0c;学完这一篇你就彻底懂了 文章目录前言一、pptx 库是什么&#xff1f;二、安装失败原因及解决方案总结前言 昨天有粉丝问我&#xff0c;为什么Python的 pptx 库老是安装失败&#xff1f;加上国内镜像源也不行&…

分布式微服务2

目录 Nacos注册中心 下载 启动 快速入门 1.在父工程中添加spring-cloud-alilbaba的管理依赖子模块添加nacos的客户端依赖 2.子模块添加nacos的客户端依赖 3.子模块配置文件 4.启动 Nacos服务分级存储模型 集群配置 nacos的负载均衡 Nacos环境隔离 新建命名空间 N…

六、Linux 软件包管理

一、Linux 软件包管理简介 1、软件包分类 源码包 - 脚本安装二进制包 -&#xff08;RPM 包&#xff0c; 系统默认包&#xff09; 2、源码包优缺点 源码包优点&#xff1a; 开源&#xff0c;可以看到&#xff0c;并且可以修改源代码。可以自由选择所需要的工能。软件是编译安…

初识 Linux Shell

学习的第一步&#xff0c;就是要找到 Linux 终端的所在位置。目前较常见的图形化终端有 Konsole、Gnome terminal、xterm 等几种。一般安装后在各个发行版的菜单中搜索即可找到。Gnome terminal 和 Konsole 基本是当前各大流行 Linux 发行版预装最多的终端应用&#xff0c;功能…

分时电价环境下用户负荷需求响应分析方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

升级JDK11后,执行java -version还是1.8

电脑同时安装两个JDK,如何来回切换1. JDK INSTALL1.1 Download1.2 配置环境变量2. 配置JDK11无效2.1 JDK切换3.Awakening1. JDK INSTALL 1.1 Download 官网下载 JDK Website: https://www.oracle.com/java/technologies/downloads/. oracle账密 zhaonan0212163.com Tomcat123…

论文翻译:Text-based Image Editing for Food Images with CLIP

使用 CLIP 对食物图像进行基于文本的图像编辑 图1&#xff1a;通过文本对食品图像进行处理的结果示例。最左边一栏显示的是原始输入图像。"Chahan"&#xff08;日语中的炒饭&#xff09;和 "蒸饭"。左起第二至第六列显示了VQGAN-CLIP所处理的图像。每个操作…

小程序项目学习--第六章:项目实战二、推荐歌曲-歌单展示-巅峰榜-歌单详情-页面优化

第六章&#xff1a;推荐歌曲-歌单展示-巅峰榜-歌单详情-页面优化 01_(掌握)音乐页面-推荐歌曲的数据获取和展示 推荐歌曲的数据获取的实现步骤 0.封装对应请求接口方法 export function getPlaylistDetail(id) {return hyRequest.get({url: "/playlist/detail",d…

Python中append浅拷贝机制

关于深浅拷贝&#xff0c;最直观的理解就是&#xff1a;深拷贝&#xff1a;拷贝的程度深&#xff0c;自己新开辟了一块内存&#xff0c;将被拷贝内容全部拷贝过来了&#xff1b;浅拷贝&#xff1a;拷贝的程度浅&#xff0c;只拷贝原数据的首地址&#xff0c;然后通过原数据的首…

分享158个ASP源码,总有一款适合您

ASP源码 分享158个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 158个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1DCXBAXJUNMZZpbyxVF5-bg?pwdbwuv 提取码&#x…

react native android环境搭建,使用vscode和夜神模拟器进行开发(适用于0.68+版本)

前言 react native官网教程 使用的是android studio搭建环境&#xff0c;本篇文章使用vscode和夜神模拟器进行搭建环境 版本说明&#xff1a; 0.68.0 及以上版本直接往下看0.67.4 及以下版本请查看另一篇文章&#xff1a;react native android环境搭建&#xff0c;使用vscod…

FineReport学习-【01 帆软报表入门】

界面功能 官方管理面板详解见这里 报表简介 报表类型 报表设计流程 新建数据连接 查看数据库连接&#xff0c;新建一个本地mysql的数据库 新建报表 新建数据集 实例操作 实例1 分组报表 新建文件夹&#xff0c;用来保存报表 将刚刚查询的数据表放入报表中&#xff0c;并插入表…

k8s核心资源ingress

一、简介ingress是分装到service层上层的一个模块&#xff0c;对外提供统一访问入口&#xff0c;ingress底层是nginx实现的&#xff0c;并且分装了域名访问。外界请求首先打到ingress层&#xff0c;ingress再转发给service层&#xff0c;service再负载均衡到其中的一个pod上。i…

关于符合车规的高精度定位产品

文章目录一、什么是P-Box二、ST的P-Box三、导远的P-Box四、华测的P-Box参考来源对于导航产品来说&#xff0c;下一个大的市场可能就是智能驾驶/辅助驾驶&#xff0c;研发符合车规的导航产品也逐渐成了行业趋势。组合导航产品的主流方案是外置的P-Box方案&#xff0c;只需要单GN…

excel定位选取:再谈快捷键Ctrl+G的妙用

一、仅复制可见单元格在日常工作中我们经常会涉及将隐藏或分类汇总后的数据&#xff0c;粘到一个新表。这个时候如果我们直接复制&#xff0c;粘贴会发生什么呢&#xff1f;这是一个分类汇总后的数据&#xff0c;自动生成了分级显示&#xff1a;第1级&#xff0c;总计&#xff…