规则引擎drools Part2

规则引擎drools Part2

本文介绍drools的基本语法。

规则文件

  1. 规则文件通常是后缀.drl(drools rule language)的文件,还支持excel类型。
package: 包名,只用于逻辑上的管理,相同包下的查询或者函数可以直接调用
import:用于导入类或者静态方法
global:定义全局变量
function:自定义函数
query:用于查询
rule end:规则体,定义一条规则,一个规则文件可以有多个规则
  1. 规则体语法结构
# rule end:表示规则的开始和结束,rule后需要指定一个唯一的规则名称
rule "规则名称"
	# 可选的规则属性
	attributes
	# when关键字后面是规则的条件部分
	when 
		# 规则条件部分,如果LHS为空,条件就一直成立
		LHS
	# then关键字后面是规则的结果部分
	then 
		# 规则的结果部分
		RHS
end

注释

  1. 在drl文件中注释和java类中注释一致,分为单行注释和多行注释。单行注释用“//”标记,多行注释以"/"开始,以“/”结束。

模式匹配

  1. 模式的语法结构是绑定变量名:Object(Field约束),绑定变量名可以省略通常以$开始,如果定义了绑定变量名,就可以在规则体的RHS部分用来操作对应的Fact对象。Field约束部分是需要返回true或者false的0个或多个的表达式。绑定变量可以用在对象上,也可以用在对象的属性上。
//规则激活的条件
//1.类型约束:工作内存中必须存在Order这种类型的Fact对象
//2.属性约束:Fact对象的originalPrice属性值必须小于100
rule "goods_discount_1"
    when
        $order:Order($op:originalPrice < 100) 
        //and/or(可以不写,默认为and)
        //$customer.Customer(age > 30)
    then
    	System.out.println("$op=" + $op);
        $order.setRealPrice($order.getOriginalPrice());
        System.out.println("匹配规则一:图书总价小于100元不打折");
end

比较操作符

> < >= == !=
contains:判断Fact对象某个属性值是否包含一个指定的对象值 
not contains:判断Fact对象某个属性值是否不包含一个指定的对象值 
memberOf: 判断一个Fact对象的某个属性是否在一个或多个集合中
not memberOf: 判断一个Fact对象的某个属性是否不在一个或多个集合中
matches:判断一个Fact对象的属性是否与提供的标准java正则表达式匹配
not matches: 判断一个Fact对象的属性是否与提供的标准java正则表达式不匹配
Object(Filed[Collection/Array] contains value)
Object(field memberOf value[Collection/Array])
Object(field matches "正则表达式")

关键字

  1. 硬关键字是我们在规则文件中定义包名或者规则名时明确不能使用的,否则程序会报错。软关键字虽然可以使用,但是不建议使用。
硬关键字包括: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

内置方法

规则文件中RHS部分作用是通过CRUD工作内存中的Fact数据,从而控制规则引擎执行。drools提供了一些方法操作工作内存中的数据,操作完成后规则引擎会重新进行规则匹配。

  1. 创建事实对象学生类
package org.lxx.drools.entity;

import lombok.Data;

/**
 * 学生
 */
@Data
public class Student {

    private int id;
    private String name;
    private int age;
    
}
  1. 编写规则文件student.drl
package student
import org.lxx.drools.entity.Student

rule "去掉年龄为12岁的学生"
    //salience用于设置规则执行的优先级,默认为0,数值大的先执行
    salience 10
    //指定规则使用的语言
    dialect "java"
    //指定当前规则是否启用
    enabled true
    when
        $student:Student(age == 12)
    then
        //retract方法的作用是删除工作内存中的数据,让相关规则重新匹配
        retract($student)
        System.out.println("触发了去掉年龄为12岁的学生的规则");
end

rule "学生的年龄为12岁"
    when
        $student:Student(age == 12)
    then
        Student stu = new Student();
        stu.setAge(5);
        //insert方法的作用是向工作内存中插入数据,让相关规则重新匹配
        insert(stu);
        System.out.println("触发了学生的年龄为12岁的规则");
end

rule "学生的年龄小于12岁"
    when
        $student:Student(age < 12)
    then
        $student.setAge(15);
        //update方法的作用是更新工作内存中的数据,让相关的规则重新匹配
        //更新数据时注意防止发生死循环
        update($student);
        System.out.println("触发了学生的年龄小于12岁的规则");
end

rule "学生的年龄大于12岁并且小于24岁"
    when
        $student:Student(age > 12 && age < 24)
    then
        $student.setAge(25);
        update($student);
        System.out.println("触发了学生的年龄大于12岁并且小于24岁的规则");
end

rule "学生的年龄大于24岁"
    when
        $student:Student(age > 24)
    then
        System.out.println("触发了学生的年龄大于24岁的规则");
end
  1. 创建启动类
package org.lxx.drools;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.lxx.drools.entity.Student;

public class DroolsDemo {

    public static void main(String[] args) {
        //KieServices是一个线程安全的单例,充当访问Kie提供的其他服务的集线器
        KieServices kieServices = KieServices.Factory.get();
        //无论是否已存在一个Kie容器,为当前类路径创建一个新的Kie容器
        KieContainer kieContainer = kieServices.newKieClasspathContainer();
        //获取默认的会话对象
        KieSession kieSession = kieContainer.newKieSession();
        Student student = new Student();
        //触发了去掉年龄为12岁的学生的规则,后续规则不再会触发
        student.setAge(12);
        //把事实对象插入工作内存中
        kieSession.insert(student);
        //激活规则,由框架自行匹配规则
        kieSession.fireAllRules();
        //关闭会话
        kieSession.dispose();
    }

}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐江小鱼

知识创造财富,期待您的慷慨解囊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值