`
onlyor
  • 浏览: 382364 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DROOLS语法详解

阅读更多

一个典型的DRL文件:

package com.sample   //包名,不可以与关键字冲突

import com.sample.DroolsTest.Message;//本文件需要导入的类

global java.util.List myGlobalList;//全局变量

//定义函数体

function String hello(String name) {

    return "Hello "+name+"!";

}

 

rule "myRule"  

no-loop true  //执行一次后,是否能被再次激活

salience 100  //优先级别

when  

m : Message( status == Message.HELLO, message : message ) 

then    

m.setMessage( "Goodbye cruel world" );

       m.setStatus( Message.GOODBYE );

       update( m );

    myGlobalList.add( "Hello World" );//使用global 变量

    System.out.println( hello( "Bob" ) );//调用定义函数

End

 

 

package com.sample

包名,不可以与关键字冲突。一个包通过名称空间描绘,这样很好的保持了一组规则的独立性。

import

标记就像java中的含义一样。对于任何要用在规则中的对象,你需要指定完整的路径和类型名。Drools从同名的java包中自动导入类。

global

如果多个包定义了同样名称的全局变量,它们必须使用同样的类型,并且全部指向同一个全局值。全部变量通常用来返回数据,获得提供数据或服务给规则使用。为了使用全局变量,你必须:

在规则文件中声明全局变量并使用它,如:

global java.util.List myGlobalList;

rule "Using a global"

when

    eval( true )

then

    myGlobalList.add( "Hello World" );

end

working memory上设置全局变量的值。最好是在将fact插入working memory之前设置完所有全局变量,如:

List list = new ArrayList();

WorkingMemory wm = rulebase.newStatefulSession();

wm.setGlobal( "myGlobalList", list );

function

相对于正常的java类,函数是在你的规则代码中放置语言代码的方法。它们不可能做任何超过你可以在帮助类(在java中定义,被设置入规则的Working Memory中的类)中做到的事情。使用函数的优点是可以将逻辑保存在一个地方,并且你可以在需要的时候改变函数(这样做各有优缺点)。函数最大的用处是被规则的推论(then)部分中的行为所调用,特别是当一个行为操作需要反复被调用时(将公用代码抽取出来成为一个函数)。

rule 名称可以在“”下取任何名字。

属性列表:

属性

类型

默认值

功能描述

no-loop

Boolean

false

设置no-looptrue可以阻止该规则被再次激活。

salience

integer

0

优先级数字高的规则会比优先级低的规则先执行。

agenda-group

String

MAIN

只有在具有焦点的agenda group中的规则才能够激发。

auto-focus

Boolean

false

如果该规则符合激活条件,则该规则所在agenda-group自动获得焦点,允许规则激发。

activation-group

String

N/A

在同名activation-group中的规则将以互斥的方式激发

dialect

String

"java" or "mvel"

指定在LHS代码表达式或RHS代码块中使用的语言。

 date-effective

String, 包含日期/时间定义

N/A

规则只能在date-effective指定的日期和时间之后激活。

date-exptires

String, 包含日期/时间定义

N/A

如果当前时间在date-expires指定的时间之后,规则不能激活。

 

duration

long

N/A

指出规则将在指定的一段时间后激发,如果那个时候规则的激活条件还是处于true的情况下。

 LHS (when) 条件元素

为了能够引用匹配的对象,使用一个模式绑定变量如‘$c’。变量的前缀使用的$是可选的,但是在复杂的规则中它会很方便用来区别变量与字段的不同。

$c : Cheese( type == "stilton", price < 10, age == "mature" )

&& || 约束连接符

Cheese( type == "stilton" && price < 10, age == "mature" )

Cheese( type == "stilton" || price < 10, age == "mature" )

第一个有两个约束而第二个组有一个约束,可以通过圆括号来改变求值的顺序。

单值约束

Matches 操作

Cheese( type matches "(Buffalo)?\S*Mozerella" )

Cheese( type not matches "(Buffulo)?\S*Mozerella" )

Contains 操作

CheeseCounter( cheeses contains "stilton" )

CheeseCounter( cheeses not contains "cheddar" )

memberof操作

CheeseCounter( cheese memberof $matureCheeses )

CheeseCounter( cheese not memberof $matureCheeses )

字符串约束

字符串约束是最简单的约束格式,将字段与指定的字符串求值:数值,日期,string或者boolean

Cheese( quantity == 5 )

Cheese( bestBefore < "27-Oct-2007" )

Cheese( type == "stilton" )

Cheese( smelly == true )

绑定变量约束

变量可以绑定到Fact和它们的字段,然后在后面的字段约束中使用。绑定变量被称为声明。有效的操作符由被约束的字段类型决定;在那里会进行强制转换。绑定变量约束使用'=='操作符,因为能够使用hash索引,因此提供非常快的执行速度。

Person( likes : favouriteCheese )

Cheese( type == likes )

返回值约束

返回值约束可以使用任何有效的Java元数据类型或对象。要避免使用任何Drools关键字作为声明标识。在返回值约束中使用的函数必须返回静态常量(time constant)结果。之前声明的绑定可以用在表达式中。

Person( girlAge : age, sex == "F" )

Person( age == ( girlAge + 2) ), sex == 'M' )

复合值约束

复合值约束用在可能有多个允许值的时候,当前只支持'in' 'not in'两个操作。这些操作使用圆括号包含用逗号分开的值的列表,它可以是变量,字符串,返回值或限定标识符。'in' 'not in'运算式实际上被语法分析器重写成多个!= and ==组成的多重约束。

Person( $cheese : favouriteCheese )

Cheese( type in ( "stilton", "cheddar", $cheese )

多重约束

多重约束允许你对一个字段通过使用'&&' 或者'||'约束连接符进行多个约束条件的判断。允许使用圆括号分组,它会让这种约束看起来更自然。

Person( age ( (> 30 && < 40) || (> 20 && < 25) ) )

Person( age > 30 && < 40 || location == "london" )

内联的Eval约束

eval约束可以使用任何有效的语言表达式,只要它最终能被求值为boolean元数据类型。表达式必须是静态常量(time constant)。任何在当前模式之前定义的变量都可以使用,自动代入(autovivification)机制用来自动建立字段绑定变量。当构建器发现标识不是当前定义的变量名是,它将尝试将它作为对象的字段来访问,这种情况下,构建器自动在inline-eval中建立该字段的同名变量。

Person( girlAge : age, sex = "F" )

Person( eval( girlAge == boyAge + 2 ), sex = 'M' )

 

RHS (then) 执行操作

这部分应当包含一系列需要执行的操作。规则的RHS部分应该保持简短的,这保持它是声明性和可读性的。如果你发现你需要在RHS中使用命令式或and/or条件代码,那你可能需要将规则拆分为多个规则。RHS的主要目的是插入,删除修改working memory数据。

"update(object, handle);" 将告诉引擎对象已经改变(已经被绑定到LHS中的那一个),并且规则需要重新检查。

"insert(new Something());" 将在working memory中放置一个你新建的对象。

"insertLogical(new Something());" insert类似,但是当没有更多的fact支持当前激发规则的真值状态时,对象自动删除。

"retract(handle);" removes an object from working memory.

 Query

查询中仅仅包含规则LHS部分的结构(不用指定whenthen)。它提供了查询working memory 中符合约束条件的对象的一个简单办法。

query "people over the age of 30"

    person : Person( age > 30 )

end

通过在返回的查询结果(QueryResults)上进行标准的for循环遍历,每一行将返回一个QueryResult,该对象可以用来存取组元中的每一个Column这些Column可以通过声明的名称或索引位置存取。

QueryResults results = workingMemory.getQueryResults( "people over the age of 30" );

for ( Iterator it = results.iterator; it.hasNext(); ) {

    QueryResult result = ( QueryResult ) it.next();

    Person person = ( Person ) result.get( "person" );

    }

 

分享到:
评论

相关推荐

    DROOLS语法详解.doc

    DROOLS语法详解.docDROOLS语法详解.doc

    DROOLS语法详解.txt

    ### DROOLS语法详解 #### 一、基本概念与组件介绍 DROOLS是一个开源的业务规则管理系统(BRMS),其核心组件包括推理引擎、工作内存管理器以及规则引擎等。DROOLS允许用户通过定义规则来实现业务逻辑的自动化处理...

    drools语法详解.doc

    在 Drools 中,DRL(Drools Rule Language)是用于编写规则的主要语言,其语法类似于Java,但更专注于规则表达。 1. **包声明(Package)**: 包名在DRL文件中起着类似Java包的作用,用于组织规则,确保命名空间的...

    SpringBoot2整合Drools规则引擎及案例详解

    主要介绍了SpringBoot2整合Drools规则引擎及案例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    drools文档详解

    #### 六、Drools语法 Drools规则文件采用.drl扩展名,其语法结构如下: 1. **Hello World示例** - 规则文件的基本结构包括包声明、导入语句和规则定义。 - 规则定义包括属性、条件和结果三部分。 - `no-loop` ...

    Drools 8.44 语法参考手册

    ### Drools 8.44 语法参考手册关键知识点解析 #### 一、Drools 规则语言(DRL)概述 - **定义**:Drools规则语言(DRL)是由Drools开源项目提供的一种专用语言,用于定义业务规则。 - **文件格式**:DRL规则被定义...

    规则引擎drools在eclipse安装详解

    **规则引擎 Drools 安装在 Eclipse 中的详解** Drools 是一款强大的规则引擎,它允许开发者在 Java 应用程序中嵌入业务规则,从而实现灵活的业务逻辑管理。下面将详细介绍如何在 Eclipse 开发环境中安装 Drools。 ...

    drools框架学习文档

    ** Drools 框架详解 ** Drools 是一款强大的开源业务规则引擎,由 JBoss 社区开发,现在是 Red Hat 的一部分。它的设计目的是帮助企业和组织以灵活、高效的方式实现业务逻辑的自动化执行。Drools 提供了一个符合...

    Myeclipse下drools开发手册

    ##### 2.3 Drools 规则文件详解 - **包声明**:`package com.sample;` 表示规则文件所在的包名。 - **导入语句**:`import` 关键字用于导入 Java 类,使得这些类可以在规则文件中使用。 - **规则定义**: - `rule`...

    Drools-复杂事件处理

    《Drools:复杂事件处理详解》 Drools,作为一个强大的规则引擎,广泛应用于业务逻辑和决策管理中。在处理复杂事件时,Drools展现了其独特的优势。本文将深入探讨Drools如何实现复杂事件处理,并提供相关语法的详细...

    Drools学习笔记

    【Drools 知识点详解】 Drools 是一个基于Java的规则引擎,它允许开发者用自然语言编写业务规则,并在运行时高效地执行这些规则。Drools 提供了一个强大的框架,使得业务逻辑与应用程序的其他部分保持松耦合,从而...

    Drools5应用手册.doc

    - **保留字**:Drools有一系列保留字,如`rule`, `when`, `then`等,用于构造规则的语法结构。 - **注释**:规则文件支持单行和多行注释,便于添加说明或暂时禁用某段规则代码。 - **Package**:规则文件的第一行...

    boot_drools

    《Spring Boot与Drools融合应用详解》 在IT领域,Spring Boot以其便捷的初始化、自动配置和微服务架构等特点,已经成为开发Java应用程序的首选框架。而Drools,作为一款强大的规则引擎,广泛应用于业务逻辑复杂的...

    drools-5.4-完整包以及myeclipse插件

    《 Drools 5.4 完整包及MyEclipse插件详解》 Drools 是一款强大的业务规则管理系统(BRMS),它基于Java平台,提供了灵活、高效的方式来管理和执行业务规则。本篇将深入探讨Drools 5.4版本的特性、使用方法以及与...

    规则引擎Drools使用手册(中文)

    ### 规则引擎Drools使用手册:4.0版更新要点详解 #### 一、Drools 4.0新特性概览 Drools 4.0是一次重要的更新,相较于之前的Drools 3.0.x系列,在语言表达、引擎性能以及工具实用性等方面都有显著提升。以下为此次...

Global site tag (gtag.js) - Google Analytics