`

drools 规则文件 —— 语法

 
阅读更多
原文:http://liureying.blog.163.com/blog/static/615135201111394058945/
更详细的看这里:drools规则语法(一) http://kingsun1980.iteye.com/blog/459272
使用 Drools 和 JPA 实现持续的实时数据分析 http://www.ibm.com/developerworks/cn/java/j-drools5/


在 Drools 当中,规则的编译与运行要通过Drools 提供的各种API 来实现,这些API 总体来讲可以分为三类:规则编译、规则收集和规则的执行。完成这些工作的API 主要有KnowledgeBuilder、KnowledgeBase、StatefulKnowledgeSession、StatelessKnowledgeSession、、等,它们起到了对规则文件进行收集、编译、查错、插入fact、设置global、执行规则或规则流等作用,在正式接触各种类型的规则文件编写方式及语法讲解之前,我们有必要先熟悉一下这些API 的基本含义及使用方法。


KnowledgeBuilder 的作用就是用来在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。
通过KnowledgeBuilder 编译的规则文件的类型可以有很多种,如.drl 文件、.dslr 文件或一个xls 文件等。产生的规则包可以是具体的规则文件形成的,也可以是规则流(rule flow)文件形成的,在添加规则文件时,需要通过使用ResourceType 的枚举值来指定规则文件的类型;同时在指定规则文件的时候drools 还提供了一个名为ResourceFactory 的对象,通过该对象可以实现从Classpath、URL、File、ByteArray、Reader 或诸如XLS 的二进制文件里添加载规则。

KnowledgeBase 是Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象,在一个KnowledgeBase 当中可以包含普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model)等。KnowledgeBase 本身不包含任何业务数据对象(fact 对象,后面有相应章节着重介绍fact 对象),业务对象都是插入到由KnowledgeBase产生的两种类型的session 对象当中(StatefulKnowledgeSession 和StatelessKnowledgeSession,后面会有对应的章节对这两种类型的对象进行介绍),通过session 对象可以触发规则执行或开始一个规则流执行。

StatefulKnowledgeSession 对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。在用
户的代码当中,最后使用完StatefulKnowledgeSession 对象之后,一定要调用其dispose()方法以释放相关内存资源。StatefulKnowledgeSession 可以接受外部插入(insert)的业务数据——也叫fact。

StatelessKnowledgeSession 的作用与StatefulKnowledgeSession 相仿,它们都是用来接收业务数据、执行规则的。事实上,StatelessKnowledgeSession 对StatefulKnowledgeSession 做了包装,使得在使用StatelessKnowledgeSession 对象时不需要再调用dispose()方法释放内存资源了。
因为StatelessKnowledgeSession 本身所具有的一些特性,决定了它的使用有一定的局限性。在使用StatelessKnowledgeSession 时不能进行重复插入fact 的操作、也不能重复的调用fireAllRules()方法来执行所有的规则,对应这些要完成的工作在StatelessKnowledgeSession当中只有execute(…)方法,通过这个方法可以实现插入所有的fact并且可以同时执行所有的规则或规则流,事实上也就是在执行execute(…)方法的时候就在StatelessKnowledgeSession内部执行了insert()方法、fireAllRules()方法和dispose()方法。

fact 对象通常是一个普通的Java 的POJO,一般它们会有若干个属性,每一个属性都会对应getter 和setter 方法,用来对外提供数据的设置与访问。一般来说,在Drools 规则引擎当中,fact 所承担的作用就是将规则当中要用到的业务数据从应用当中传入进来,对于规则当中产生的数据及状态的变化通常不用fact 传出。如果在规则当中需要有数据传出,那么可以通过在StatefulKnowledgeSession 当中设置global 对象来实现,一个global 对象也是一个普通的Java 对象,在向StatefulKnowledgeSession 当中设置global 对象时不用insert 方法而用setGlobal 方法实现。
    public static void main(String[] args) {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("test.drl",Test.class), ResourceType.DRL);
        Collection<KnowledgePackage> kpackage =kbuilder.getKnowledgePackages();
        KnowledgeBaseConfiguration kbConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
        kbConf.setProperty("org.drools.sequential", "true");
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConf);
        kbase.addKnowledgePackages(kpackage);//将KnowledgePackage集合添加到KnowledgeBase当中
        StatefulKnowledgeSession statefulKSession = kbase.newStatefulKnowledgeSession();
        statefulKSession.setGlobal("globalTest", new Object());//设置一个global对象
        statefulKSession.insert(new Object());//插入一个fact对象
        statefulKSession.fireAllRules();
        statefulKSession.dispose();
    }




Drools 分为两个主要部分:构建( Authoring )和运行时( Runtime )。 这遍文章介绍 构建时 .drl 或 .xml 规则文件编写
1.规则文件语法和支持的语言
规则文件有自己的语法用于绑定参数,条件判断跟 function ,queries等构成规则文件部分。
其它部分可以使用规则文本支持语言的脚步:目前支持:mvel和Java。默认使用java.
不管使用那种语言,要遵守那种语言的语法
示例:
package com.demo
rule "It of valid age"
when
  $a : Applicant( age < 18 )
then
  $a.setValid(false);
end

note:
黑体字是规则文件关键字
该颜色字体是规则文件语法
该颜色字体是java语法
$a是规则内的变量,在规则内对该规则变量操作

2.规则文件构成
package(规则文件所在包*)
import(导入java 包)
globals
function(函数)
queries(查找)
rules(规则*)


3.规则引擎处理规则文件流程
输入参数 ---> 引擎读规则文件并绑定输入参数 ---> 处理规则满足条件则按结果部分逻辑处理

4.编写规则文件思路
import 必须的包和类,和Java静态方法,语句要以;号结束等
java属性处理语句只能出现rule的结果部分,而在条件部分则只能是创建语句
在条件部分要使用规则引擎的语法


5.语法介绍
绑定参数语法:
  $[绑定变量名] : Object([field 约束])

示例:
$add : Address() add 绑定外面传入的Address对象
$add : new Address() add 绑定新建的Address对象
$name:String(); 传入一个字符串与name绑定

条件判断
$绑定变量名 :绑定类型(属性1 比较符合 比较值)
note:
括号内可以包含多个属性比较有 “&&”、 “||” , “,” 
“&&”表示and、 “||”表示or , “,”表示连接

示例:
$app:Applicant(name == "依晨",age<30)  
#必须是满足name=依晨,age<30的Applicant

   结果部分处理
      1.通过insert,update和 retract对当前 Working Memory 中的 Fact 对象进行新增、删除或者是修改。
note:
一旦调用insert,update和 retract宏函数,那么 Drools会重新与所有的规则再重新匹配一次,对于没有设置 no-loop 属性为 true的规则,如果条件满足,不管其之前是否执行过都会再执行一次

insert
作用:
在Java类当中调用StatefulKnowledgeSession对象的insert方法的作用相同
语法:
insert(new Object());
示例:
rule "rule1" 
salience 1
when 
eval(true);
then  
System.out.println("rule1");
Applicant app = new Applicant("kaka",24);
#insert(app);
drools.insert(app); 
end


update
作用:
update函数意义与其名称一样,用来实现对当前Working Memory当中的Fact进行更
语法:
update(new Object());
示例:
rule "rule2"
    salience 1
    #no-loop true 不会循环
 when
       $app:Applicant(name == "依晨",age<30)
 then
       #update方法2
       Applicant app = new Applicant("依晨",$app.getAge() + 1); 
       update(drools.getWorkingMemory().getFactHandleByIdentity($app),app); 
    
       #update方法1 
       #$app.setAge($app.getAge() + 1);
       #update($app);
       System.out.println("------" + $app.getName()+"("+ $app.getAge() + ")");
end


retract
作用:
和 StatefulSession 的 retract方法一样,宏函数 retract也是用来将 Working Memory当中
某个 Fact对象从Working Memory当中删除
语法:
update(new Object());
示例:
rule "rule2"
salience 1 
when 
$app:Applicant(name == "依晨"); 
then   
#retract($app); 
drools.retract($app);  
end


note:
除了insert,update和 retract函数外还有drools 宏对象来处理规则.
还可以通过$绑定变量名.绑定Java对象的方法
$app.setAge($app.getAge() + 1);




例子:
1. 遍历List:
定义:
package com.pandy.rulemodel;

import com.pandy.model.RhSysGrid;
import com.pandy.model.RhSysGridColumn;
import com.pandy.model.RhSysUser;

import java.util.List;
public class TestProcessModel {
    List<RhSysGrid> gridList;
    List<RhSysGridColumn> columnList;
    List<RhSysUser> userList;
    //......
}


启动之前初始化数据:
        Map<String, Object> params = new HashMap<String, Object>();
        List<RhSysGrid> gridList = rhService.getAllGrid();
        List<RhSysGridColumn> columnList = rhService.getAllGridColumn();
        List<RhSysUser> userList = rhService.getAllUser();

        TestProcessModel testProcessModel = new TestProcessModel();
        testProcessModel.setGridList(gridList);
        testProcessModel.setColumnList(columnList);
        testProcessModel.setUserList(userList);
        params.put("testProcessModel", testProcessModel);
        ksession1.startProcess(proId, params);
        ksession1.fireAllRules();


工作流RuleTask前面的ScriptTask加入信息到引擎: 省略变量配置等
kcontext.getKnowledgeRuntime().insert(testProcessModel);

规则文件:
package com.pandy.jbpm;


import java.util.List;
import com.pandy.model.RhSysGrid;
import com.pandy.rulemodel.TestProcessModel;

rule "Hello World Rule" ruleflow-group "Print"
when
	$testModel : TestProcessModel()
	$gridList : List() from collect ( RhSysGrid(gridId<=100) from $testModel.gridList )
then
	System.out.println("一个Drools测试例子: Hello World Rule="+ $gridList.size());
end
分享到:
评论

相关推荐

    Drools规则执行顺序

    标题 "Drools 规则执行顺序" 涉及的是一个业务规则引擎——Drools 的核心概念。Drools 是一个开源的Java决策管理平台,它允许开发者使用规则语言来编写业务逻辑,这些规则可以按特定顺序执行,以处理复杂的业务场景...

    drools动态生成规则文件

    drools动态生成规则文件是基于Java的业务规则管理系统,它允许开发者在运行时创建、修改和执行业务规则。 Drools是Red Hat JBoss BRMS(Business Rules Management System)的一部分,它提供了一种强大的规则引擎,...

    Drools规则引擎介绍.ppt

    【Drools规则引擎介绍】 Drools是一款由JBoss公司开发的开源规则引擎,它致力于将业务规则从复杂的业务逻辑代码中分离出来,实现业务规则的独立管理和灵活变更。Drools基于Rete算法,这是一套高效的规则匹配算法,...

    Drools规则引擎使用demo

    3. **Drools规则语法**: - `rule "规则名"` 定义一个规则,规则名用于标识规则。 - `when` 开始定义规则的条件,可以使用Drools的DSL(Domain Specific Language)或者MVEL表达式。 - `then` 规则的行动部分,当...

    Drools 规则流的使用介绍

    **Drools 规则流的使用介绍** Drools 是一个开源的业务规则管理系统(BRMS),它基于Java平台,提供了强大的规则引擎和规则流(Workflow)功能。这篇文章将深入探讨Drools如何实现规则流,以及如何在实际项目中有效...

    Drools开发教程、规则引擎.pdf

    在Drools中,规则被定义在规则文件(通常是.drl文件)中,并遵循一种特定的语法。一个典型的规则由三部分组成:条件(when)、操作(then)和元数据(metadata)。条件部分定义了规则被触发的条件,操作部分描述了当...

    drools规则文件

    drools开发

    Drools 规则引擎的介绍及应用

    #### 三、Drools规则集文件语法 Drools规则通常使用Drools Rule Language (DRL)编写,这是一种简洁而强大的语言,允许开发者以自然语言风格定义业务规则。DRL支持条件表达式、函数调用等多种语法结构,并且能够与...

    Drools规则引擎从入门到精通源码

    从基础讲起,结合应用场景,由浅到深细化讲解drools规则引擎的的相关知识,并结合具体实例,演示功能的使用和注意事项。后面通过搭建具体的项目并结合springboot框架联合使用Drools的相关知识包括决策表的使用,囊括...

    Drools规则引擎开发实例+源码

    规则通常使用Drools特有的领域特定语言(DSL)或类Java语法来编写。 2. **事实(Fact)**:事实是在Drools工作内存中存储的数据对象,它们可以是任何Java对象,代表了业务环境中的状态。规则通过匹配事实来触发。 ...

    Drools7 + Springboot2 动态更新规则

    Drools 7引入了更高效的工作内存管理,优化了执行性能,并提供了更丰富的API和改进的规则语法。 接下来,我们讨论如何在Spring Boot项目中集成Drools。首先,我们需要在`pom.xml`中添加Drools和Spring Boot的依赖。...

    springboot整合Drools规则引擎,实现高效的业务规则

    2、规则语法 (1)、演示drl文件格式 package droolRule ; import org.slf4j.Logger import org.slf4j.LoggerFactory ; dialect "java" rule "paramcheck1" when then final Logger LOGGER = LoggerFactory....

    springboot集成drools实现重新加载规则

    接下来,我们需要创建Drools的规则文件(`.drl`),该文件包含了业务规则的定义。例如: ```drl package com.example.rules import com.example.model.MyObject; rule "Example Rule" when $myObject : MyObject...

    从Drools规则引擎到风控反洗钱系统v0.3.2.pdf

    10. **规则**:详细介绍了Drools中的规则文件编写,包括规则文件的基本语法、包(package)、规则属性、定时器和日历的使用等。 11. **LHS和RHS语法**:解释了规则左侧(LHS)和右侧(RHS)的语法结构,它们分别...

    drools 语法教程

    KnowledgeBuilder 是 Drools 提供的 API,用来在业务代码中收集已经编写好的规则,然后对这些规则文件进行编译,最后产生一批编译好的规则包(KnowledgePackage)给其他应用程序使用。KnowledgeBuilder 在编译规则的...

    Droosl规则文件+语法结构+案例实现代码

    该资源文件是本人CSDN 技术文章专栏《Drools》相关文章的代码案例,包含了Drools规则文件语法代码、规则属性测试代码、Drools高级语法代码、综合案例-消费积分案例代码等相关内容;有兴趣的朋友可以下载下来看看;...

    drools-规则语言

    1. **编写规则文件**:创建Drools规则文件(.drl),定义规则的条件和操作。 2. **加载规则**:使用Drools框架加载规则文件。 3. **插入事实**:向规则引擎中插入事实(通常是Java对象)。 4. **执行规则**:触发规则...

    Drools规则引擎样例系统

    这些源码通常以DRL文件形式存在,包含了所有业务规则的定义。通过DRL,开发者可以明确地指定规则的触发条件、行动以及优先级。Drools内部使用了基于内存的rete算法,这种高效的匹配机制使得Drools能在大量规则和事实...

    Drools规则引擎及教程

    3. **规则语法**:掌握Drools的DRL(Drools Rule Language)语言,学习如何编写规则,包括条件语句(LHS,左侧)和动作语句(RHS,右侧)。 4. **规则的加载与执行**:学习如何使用KieSession加载规则,并通过...

Global site tag (gtag.js) - Google Analytics