drools规则引擎语法(四)

1,规则文件的组成

     在实际应用中,主要的任务其实就是写规则文件,规则文件的后缀通常以.drl结尾(drools规则引擎除了支持.drl格式的文件外,还支持excel文件类型的,就是规则表);drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。

关键字描述
package包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用
import用于导入类或者静态方法
global全局变量
function自定义函数
query查询
rule end规则体

 

2,规则文件的基本格式组成

rule "ruleName"
    attributes
    when
        LHS
    then
        RHS
end

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

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

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

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

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

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

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

3,注释

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

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

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

4,pattern模式匹配

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

    pattern的语法结构为:绑定变量名:Object(Field约束)

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

package rules;
import  com.dream21th.drools.study.demo2.Student;

rule "demo2_1"
    //匹配年龄小于10岁
    when
       $s:Student( age<10)
    then
       System.out.println("触发demo2_1:年龄小于"+$s.getAge());
       $s.setResult("触发demo2_1:年龄小于"+$s.getAge());
end

rule "demo2_2"
    //匹配年龄等于10岁
    when
       $s:Student( age==10)
    then
       System.out.println("触发demo2_2:年龄等于"+$s.getAge());
       $s.setResult("触发demo2_2:年龄等于"+$s.getAge());
end

rule "demo2_3"
    //匹配年龄大于10岁
    when
       $s:Student( age>10)
    then
       System.out.println("触发demo2_3:年龄大于"+$s.getAge());
       $s.setResult("触发demo2_3:年龄大于"+$s.getAge());
end

rule "demo2_4"
    //匹配年龄大于10岁 并且性别是“男”
    when
       $s:Student( age>10 && sex=="男")
    then
       System.out.println("触发demo2_4:年龄大于"+$s.getAge()+"且性别:"+$s.getSex());
       $s.setResult("触发demo2_4:年龄大于"+$s.getAge()+"且性别:"+$s.getSex());
end

rule "demo2_5"
    //匹配年龄大于10岁 并且性别是“女”
    when
       $s:Student( age>10 && sex=="女")
    then
       System.out.println("触发demo2_5:年龄大于"+$s.getAge()+"且性别:"+$s.getSex());
       $s.setResult("触发demo2_5:年龄大于"+$s.getAge()+"且性别:"+$s.getSex());
end

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

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

2、Fact对象的age属性值必须满足约束条件------属性约束

3、Fact对象的sex属性值必须满足约束条件-----属性约束

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dream21st

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值