前面介绍了Drools规则引擎,并讲解了一个编写drl文件的Demo,学习了Drools加载规则文件到规则引擎,注入Fact参数并触发规则的流程。本篇主要介绍Drool规则文件的构成,组成规则文件一些属性。

目录

规则文件构成

规则体语法结构

Pattern模式匹配

比较操作符

执行指定规则

关键字


规则文件构成

在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl。drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。

一套完整的规则文件内容构成如下:

Drools支持的规则文件,除了drl形式,还有Excel文件类型的。

规则体语法结构

规则体是规则文件内容中的重要组成部分,是进行业务规则判断、处理业务结果的部分。

rule "ruleName"attributeswhenLHSthenRHS
end

rule:关键字,表示规则开始,参数为规则的唯一名称。

attributes:规则属性,是rule与when之间的参数,为可选项。

when:关键字,后面跟规则的条件部分。

LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。

then:关键字,后面跟规则的结果部分。

RHS(Right Hand Side):是规则的后果或行动部分的通用名称。

end:关键字,表示一个规则结束。

  • 注释

在drl形式的规则文件中使用注释和Java类中使用注释一致,分为单行注释和多行注释。

单行注释用"//"进行标记,多行注释以"/*"开始,以"*/"结束。如下示例:

//规则rule1的注释,这是一个单行注释
rule "rule1"
    when
    then
        System.out.println("rule1触发");
end

/*
规则rule2的注释,
这是一个多行注释
*/
rule "rule2"
    when
    then
        System.out.println("rule2触发");
end

Pattern模式匹配

前面我们已经知道了Drools中的匹配器可以将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,那么我们就需要在规则体的LHS部分定义规则并进行模式匹配。LHS部分由一个或者多个条件组成,条件又称为pattern。

pattern的语法结构为:绑定变量名:Object(Field约束)。其中绑定变量名可以省略,通常绑定变量名的命名一般建议以$开始。如果定义了绑定变量名,就可以在规则体的RHS部分使用此绑定变量名来操作相应的Fact对象。Field约束部分是需要返回true或者false的0个或多个表达式。

例如我们的入门案例中:

rule "book_discount_2"when//Order为类型约束,originalPrice为属性约束$order:Order(originalPrice < 200 && originalPrice >= 100)then$order.setRealPrice($order.getOriginalPrice() - 20);System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end

通过上面的例子我们可以知道,匹配的条件为:

1、工作内存中必须存在Order这种类型的Fact对象-----类型约束

2、Fact对象的originalPrice属性值必须小于200------属性约束

3、Fact对象的originalPrice属性值必须大于等于100------属性约束

以上条件必须同时满足当前规则才有可能被激活。

绑定变量既可以用在对象上,也可以用在对象的属性上。例如上面的例子可以改为:

"book_discount_2"
    when
        $order:Order($op:originalPrice < 200 && originalPrice >= 100)
    then
        System.out.println("$op=" + $op);
        $order.setRealPrice($order.getOriginalPrice() - 20);
        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end

LHS部分还可以定义多个pattern,多个pattern之间可以使用and或者or进行连接,也可以不写,默认连接为and。

rule "book_discount_2"
    when
        $order:Order($op:originalPrice < 200 && originalPrice >= 100) and
        $customer:Customer(age > 20 && gender=='male')
    then
        System.out.println("$op=" + $op);
        $order.setRealPrice($order.getOriginalPrice() - 20);
        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end

比较操作符

Drools提供的比较操作符,如下表:

前6个比较操作符和Java中的完全相同,下面我们重点学习后6个比较操作符。

语法

  • contains | not contains语法结构

    Object(Field[Collection/Array] contains value)

    Object(Field[Collection/Array] not contains value)

  • memberOf | not memberOf语法结构

    Object(field memberOf value[Collection/Array])

    Object(field not memberOf value[Collection/Array])

  • matches | not matches语法结构

    Object(field matches "正则表达式")

    Object(field not matches "正则表达式")

demo:

  • 创建实体类:
public class ComparisonOperatorEntity {private String names;private List<String> list;public String getNames() {return names;}public void setNames(String names) {this.names = names;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}
}
  • 创建规则文件
package comparisonOperator
import com.fairyland.demo.pojo.ComparisonOperatorEntity
/*当前规则文件用于测试Drools提供的比较操作符
*/
//测试比较操作符contains
rule "rule_comparison_contains"whenComparisonOperatorEntity(names contains "张三")ComparisonOperatorEntity(list contains names)thenSystem.out.println("规则rule_comparison_contains触发");
end
//测试比较操作符not contains
rule "rule_comparison_notContains"whenComparisonOperatorEntity(names not contains "张三")ComparisonOperatorEntity(list not contains names)thenSystem.out.println("规则rule_comparison_notContains触发");
end
//测试比较操作符memberOf
rule "rule_comparison_memberOf"whenComparisonOperatorEntity(names memberOf list)thenSystem.out.println("规则rule_comparison_memberOf触发");
end
//测试比较操作符not memberOf
rule "rule_comparison_notMemberOf"whenComparisonOperatorEntity(names not memberOf list)thenSystem.out.println("规则rule_comparison_notMemberOf触发");
end
//测试比较操作符matches
rule "rule_comparison_matches"whenComparisonOperatorEntity(names matches "张.*")thenSystem.out.println("规则rule_comparison_matches触发");
end
//测试比较操作符not matches
rule "rule_comparison_notMatches"whenComparisonOperatorEntity(names not matches "张.*")thenSystem.out.println("规则rule_comparison_notMatches触发");
end

测试:

    public static void testComparisionOprationTest(){KieServices kieServices = KieServices.Factory.get();KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();KieSession kieSession = kieClasspathContainer.newKieSession();ComparisonOperatorEntity comparisonOperatorEntity = new ComparisonOperatorEntity();comparisonOperatorEntity.setNames("张三");List<String> list = new ArrayList<String>();list.add("张三");list.add("李四");comparisonOperatorEntity.setList(list);//将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配,如果规则匹配成功则执行规则kieSession.insert(comparisonOperatorEntity);kieSession.fireAllRules();kieSession.dispose();}

执行指定规则

通过前面的案例可以看到,我们在调用规则代码时,满足条件的规则都会被执行。那么如果我们只想执行其中的某个规则如何实现呢?Drools给我们提供的方式是通过规则过滤器来实现执行指定规则。对于规则文件不用做任何修改,只需要修改Java代码即可,如下:

KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
​
ComparisonOperatorEntity comparisonOperatorEntity = new ComparisonOperatorEntity();
comparisonOperatorEntity.setNames("张三");
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
comparisonOperatorEntity.setList(list);
kieSession.insert(comparisonOperatorEntity);
​
//通过规则过滤器实现只执行指定规则
kieSession.fireAllRules(new RuleNameEqualsAgendaFilter("rule_comparison_memberOf"));
​
kieSession.dispose();

关键字

Drools的关键字分为:硬关键字(Hard keywords)和软关键字(Soft keywords)。

硬关键字是我们在规则文件中定义包名或者规则名时明确不能使用的,否则程序会报错。软关键字虽然可以使用,但是不建议使用。

硬关键字包括:true false null

软关键字包括:

lock-on-active  date-effective date-expires no-loop auto-focus activation-group agenda-group ruleflow-group entry-point duration package import dialect salience enabled attributes rule extend when then template query declare function global eval not in or and exists forall accumulate collect from action reverse result end over init

规则引擎Drools使用 第四篇Drools基础语法相关推荐

  1. 视频教程-跟着王进老师学开发之C#篇:基础语法-C#

    跟着王进老师学开发之C#篇:基础语法 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥208.00 ...

  2. 跟着王进老师学开发之C#篇:基础语法-王进-专题视频课程

    跟着王进老师学开发之C#篇:基础语法-10520人已学习 课程介绍         本次课程是初级课程,只要熟悉计算机的基本应用和操作,都可以完成本次课程学习.本课程深入浅出的介绍了C#语言的基本语法 ...

  3. 规则引擎Drools使用 第七篇 Drools 常见的属性

    Drools的一些属性 Drools中提供的属性如下表(部分属性): 接下来分别写一些demo介绍下这些属性的使用. salience属性 salience属性用于指定规则的执行优先级,取值类型为In ...

  4. 《Drools7.0.0.Final规则引擎教程》第1章 Drools简介

    1.1 什么是规则引擎 规则引擎是由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务 ...

  5. Python 基础(四):基础语法

    文章目录 一.保留字(关键字) 二.标识符 三.代码缩进 四.注释 五.编码规范 六.命名规范 系列文章 热门专栏 大家好,我是水滴~~ 本篇我们来学习一下 Python 的基础语法,主要内容有:保留 ...

  6. java方法四要素_Java基础语法

    Free Talk 最近在JavaGuide博客里面兜兜转转了几天,一边等华为的实训消息,一边随便看点Java后端开发的知识.但是这一周总感觉看了就忘,而且光看也很容易走神发呆,要不然就是去打王者啥的 ...

  7. 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法

    RHS语法 使用说明 RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息.RHS主要用于处理结果,因此不建议在此部分再进行业务判断.如果必须要业务判断需要考虑规则设计的 ...

  8. 第四篇 NumPy基础:数组和⽮量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.⼤多数提供科学计算的包都是⽤NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,⼀个具 ...

  9. Dart语法篇之基础语法(一)

    简述: 又是一段新的开始,Dart这门语言相信很多人都是通过Flutter这个框架才了解的,因为Flutter相比Dart更被我们所熟知.很多人迟迟不愿尝试Flutter原因大多数是因为学习成本高,显 ...

最新文章

  1. 常见计算机英语词汇翻译,常见计算机英语词汇解释(1)
  2. 决策树 prepruning_数据挖掘入门系列教程(三点五)之决策树
  3. python文本去重_Python做文本按行去重的实现方法
  4. Hbase(5)——python用happybase操作Hbase
  5. 强制修改上网本分辨率
  6. 【HDU - 3081】Marriage Match II(网络流最大流,二分+网络流)
  7. Zookeeper 辅助 API
  8. ae制h5文字动画_AE文字拉伸动画如何制作
  9. 《An Introduction to Ray Tracing》—— 2.5 Ray/Quadric Intersection And Mapping
  10. 如何选择最佳云托管服务提供商
  11. 优秀在线答题小程序汇总分享
  12. pb与java_Java中使用PB教程
  13. keil5工程函数无法跳转到函数定义解决方法
  14. redis缓存服务器
  15. 玩转软路由 篇一:巨详细的修改Esxi7.0管理端口教程
  16. thinkphp5中带参数跳转
  17. request method ‘DELETE‘ not supported报错处理
  18. 小白学python-决策树和随机森林
  19. python 苹果笔记本电脑报价_千万别花冤枉钱!大学生买本得这么选!
  20. 新手做饮料代理如何运作市场?

热门文章

  1. python decimal是什么类型_decimal 详解
  2. 使用EasyExcel生成表格文件-简单使用
  3. 华清远见星创客高手云集 辞职学嵌入式学员高达50%
  4. python变量隔一个数取出来_Python(二):变量、常量,字符串操作
  5. 【详解】springboot 集成 websocket实现网页版实时聊天
  6. wdcdn多节点分布式CDN系统1.3发布
  7. docker(11、Docker Swarm4)11、副本数量(replicated 和 global )12、Label 控制 Service 的位置 13、如何配置 Health Check
  8. 聚焦 | 电力行业国产操作系统迎来大市场,麒麟信安积极承接发展新机遇
  9. 谁拥有你的数据?谁又动了你的数据?
  10. 这篇文章只是用来体验一下QQ云输入法