drools 语法

ads

2.0 概述

本章节主要讲解Drools规则语法的基本概念、语法结构以及如何使用该语法开发规则。在本章节中,读者将学习到:

    • Drools 规则语法的基本概念

    • Drools 规则语法的语法结构

    • 如何使用 Drools 规则语法开发规则

    • Drools 规则语法的一些常见用法

本章节将详细地演示如何使用Drools规则语法进行规则开发,并通过大量实例进行详细解释,使读者能够熟练掌握 Drools 规则语法。

2.1 定义规则

定义规则是 Drools 的核心部分,每一条规则都是一个模板,用于识别符合特定模式的事实。一个规则的语法如下:

rule "规则名称"
when
条件语句
then
执行语句
end

定义规则的时候,可以设置规则的名称、条件语句和执行语句。规则的名称是可读的字符串,用于描述规则的用途。

下面是一个实例,用于说明如何定义规则:

rule "预警规则"
when
$person : Person(age > 18)
then
System.out.println("预警:" + $person.getName() + "的年龄大于18岁");
end

在上面的规则中,我们定义了一个名为预警规则的规则,规则的条件语句是年龄大于 18 岁,并且当条件语句成立时,执行语句会输出预警信息。

2.2 模式匹配语法

模式匹配语法是 Drools 的一种用于识别事实的语法,其语法格式如下:

$变量名 : 类型 (属性 = 值)

模式匹配语法中的变量名是任意的,用于在规则中引用该对象,类型是 Java 对象的类型,属性是对象的属性,值是该属性的值。

在Drools规则引擎中,模式匹配语法是一种查找对象的方法,可以将它们与规则匹配。模式匹配语法的语法如下:

$变量名 : 类型(条件语句)

举个例子,我们需要找到所有价格高于100的商品:

rule "high priced items"
when
$item : Item( price > 100 )
then
System.out.println("价格高于100的商品为:" + $item.getName());
end

2.3 数据类型

Drools支持的数据类型,包括Java内置数据类型以及用户定义的数据类型。

Drools支持以下数据类型:

    • 原始数据类型:包括布尔型,整型,浮点型,字符型,字符串型等。

    • 对象类型:包括Java对象,集合类型等。

如果需要在规则中使用Java对象类型,需要先定义该类型的Fact对象。例如:

declare Person
name : String
age : int
end

对于集合类型,Drools支持的集合类型包括:

    • List

    • Set

    • Map

例如,定义一个List类型的Fact对象:

declare Orders
orderList : List
end

Drools还支持一些特殊的数据类型,如Date、Time、Duration等,可以根据需要使用。下面是一个简单的例子,演示了如何在规则中使用数据类型:

declare Person
name : String
age : int
end

rule "check age"
when
$p : Person(age > 18)
then
System.out.println($p.getName() + " is an adult.");
end

在上面的例子中,我们定义了一个Person类型的Fact对象,并且在规则中使用了age字段。如果一个Person的年龄大于18岁,就会触发规则。

2.4 变量引用

在Drools规则引擎中,变量引用是一个很重要的概念。它可以让我们在规则中引用任意一个Java对象,从而判断该对象是否符合特定条件。

我们可以在规则定义中声明一个变量,并在规则条件语句中使用该变量引用对象的属性进行判断。

例如:

// 声明一个变量person
declare Person
name : String
age : int
end

// 定义一个规则,当person的年龄大于18时,触发规则
rule "adult person"
when
$p : Person(age > 18)
then
System.out.println($p.name + " is an adult.");
end

在这个例子中,我们声明了一个名为Person的变量,并定义了该变量的两个属性:name和age。在规则定义中,我们使用了一个$p变量引用Person对象,并在规则条件语句中使用了$p.age引用Person对象的age属性,判断该Person对象是否是成年人。

结合实际应用,变量引用是Drools强大的特性之一,通过引入变量,我们可以更灵活地编写规则,并能够根据不同的需求实现丰富的业务场景。

2.5 条件语法

在Drools规则中,条件语法是非常重要的一部分,它决定了规则是否应该被执行。在Drools中,可以使用条件语法来判断对象的状态是否满足特定的要求。

Drools支持多种运算符,用于定义条件语句和规则执行语句,常见的运算符包括:

    1. 算术运算符:+、-、*、/ 等,用于数学运算。

    2. 比较运算符:>、<、>=、<=、==、!= 等,用于比较两个值的大小关系。

    3. 逻辑运算符:&&、||、! 等,用于逻辑判断。

    4. 条件运算符:? : 等,用于按条件执行语句。

    5. 成员运算符:in、not in 等,用于判断一个值是否是某个集合或列表的成员。

    6. 特殊运算符:

    • in:判断一个值是否在指定的集合中。

    • not in:判断一个值是否不在指定的集合中。

    • exists:判断是否存在匹配的事实对象。

    • eval:执行Java代码并返回结果。

    • pattern:用于在规则中引用模式。

如下为一些使用运算符写的条件表达式示例

Drools条件语法使用Java中的布尔运算符和语法,例如:

Person(age < 30)

条件语法还支持使用Java中的算术运算符,例如:

Person(age + 5 < 35)

条件语法还支持使用Java中的逻辑运算符,例如:

Person(age < 30 && name.startsWith("J"))

条件语法还支持使用Drools中的函数,例如:

Person(isAdult(age))

下面是一个使用条件语法的代码示例:

rule "check customer age"
when
Customer( age >= 18 )
then
System.out.println("The customer is over 18.");
end

在这个示例中,我们定义了一个规则“check customer age”,在when部分,我们使用了条件语法来判断客户的年龄是否大于等于18岁,如果满足条件,那么在then部分,将会输出“The customer is over 18.”。

除了简单的逻辑表达式,Drools还支持更复杂的条件语句,如下面的示例所示:

rule "complex condition example"
when
$p : Person( age >= 18 && name == "John" )
then
System.out.println("Person is eligible to vote and his name is John");
end

该规则说明,当一个人的年龄大于等于18岁并且名字为John时,才能执行该规则。

总的来说,Drools的条件语法是非常强大的,可以满足大多数业务需求,并且非常易于使用和理解。本章节简单介绍了常用的运算符及运算规则,后续文章会详细介绍有关属性的使用方法。

2.6 规则执行语法

在Drools中,规则的执行语法是指在规则满足条件时所要执行的操作。这些操作可以是对于规则中的变量的修改,也可以是执行一些方法,或者是结合其他语法在规则中实现一些业务逻辑。

规则执行语法包括以下内容:

    • 赋值语法:使用赋值语法可以给规则中的变量赋值。

    • 方法调用语法:使用方法调用语法可以在规则中执行指定的方法。

    • insert语法:使用insert语法可以向Working Memory中插入新的对象。

    • retract语法:使用retract语法可以从Working Memory中移除对象。

    • modify语法:使用modify语法可以对Working Memory中的对象进行修改。

下面是一个代码示例,该示例演示了规则执行语法的使用。

rule "apply discount"
when
$customer : Customer(purchased >= 1000)
then
modify($customer) { setDiscount(0.1) };
end

在上述代码中,我们定义了一个规则,该规则检查Customer对象的purchased属性是否大于等于1000。如果该条件为真,则使用modify语法对该对象的discount属性进行修改,将其设置为0.1。

Drools规则有如下常用属性:

属性名称

类型

默认值

描述

no-loop

Boolean

false

在一个规则当中如果条件满足就对`Working Memory`当中的某个Fact对象进行了修改,比如使用update 将其更新到当前的`Working Memory`当中,这时引擎会再次检查所有的规则是否满足条件,如果满足会再次执行.

salience

Integer

0

设置规则执行的优先级,salience 属性的值是一个数字,数字越大执行优先级越高,同时它的值可以是一个负数.

agenda-group



定义激活的规则组,一个规则组中的规则只会被激活一次。

activation-group

String

N/A

定义规则的优先级。当一个规则匹配事实时,Drools将把规则加入到该组的议程中,并选择优先级最高的规则执行。

lock-on-active

Boolean

false

当在规则上使用ruleflow-group 属性或agenda-group 属性的时候,将lock-on-action 属性的值设置为true,可能避免因某些Fact 对象被修改而使已经执行过的规则再次被激活执行。可以看出该属性与no-loop 属性有相似之处,no-loop 属性是为了避免Fact 修改或调用了insertretractupdate 之类而导致规则再次激活执行,这里的lock-on-action 属性也是起这个作用,lock-on-activeno-loop 的增强版属性,它主要作用在使用ruleflow-group 属性或agenda-group 属性的时候

ruleflow-group

String

N/A

Ruleflow是一个Drools功能,可让您控制规则的触发。由相同的规则流组标识汇编的规则仅在其组处于活动状态时触发。将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用对应的规则。

dialect

String

"java" or "mvel"

dialect种类是用于LHS或RHS代码块中的任何代码表达式的语言。目前有两种dialectJavaMVEL。虽然dialect可以在包级别指定,但此属性允许为规则覆盖包定义。

date-effective

N/A

dd-MMM-yyyy

仅当当前日期和时间在日期有效属性后面时,才能激活规则。

date-expires

N/A

dd-MMM-yyyy

如果当前日期和时间在date-expires属性之后,则无法激活规则.

enabled

Boolean

True

表示规则是可用的,如果手工为一个规则添加一个enabled属性,并且设置其enabled属性值为false,那么引擎就不会执行该规则.

duration

Long

N/A

持续时间指示规则将在指定的持续时间之后触发,如果它仍然是true.


最后编辑于:2024/1/16 拔丝英语网

admin-avatar

英语作文代写、国外视频下载

高质量学习资料分享

admin@buzzrecipe.com