一段孤独的代码 一段孤独的代码

A Lonely Code

目录
drools规则引擎写法
/      

drools规则引擎写法

drools

规则引擎

语法

关键字

Package

package

包定义,规则文件的第一行

1package aaa
import

引入资源,和javaimport一样

1import java.util.List
global
  1. 定义规则全局变量

    1global java.util.List myGlobalList;
    2
    3rule "Using a global"
    4when
    5  eval( true )
    6then
    7  myGlobalList.add( "Hello World" );
    8end
    
  2. 在过程中添加全局变量

    1List list = new ArrayList();
    2KieSession kieSession = kiebase.newKieSession();
    3kieSession.setGlobal( "myGlobalList", list );
    

Function

function
  1. 定义规则文件中的方法

     1function String hello(String name) {
     2  return "Hello "+name+"!";
     3}
     4import function my.package.Foo.hello
     5rule "using a static function"
     6when
     7  eval( true )
     8then
     9  System.out.println( hello( "Bob" ) );
    10end
    

Query

query
  1. 搜索工作内存中与指定条件匹配的事实的简单方法

     1对所有30岁以上的人的简单查询
     2query "people over the age of 30"
     3    person : Person( age > 30 )
     4end
     5
     6查询超过x岁的人,以及居住在y的人
     7query "people over the age of x"  (int x, String y)
     8    person : Person( age > x, location == y )
     9end
    10
    11QueryResults results = ksession.getQueryResults( "people over the age of 30" );
    12System.out.println( "we have " + results.size() + " people over the age  of 30" );
    13
    14System.out.println( "These people are are over 30:" );
    15
    16for ( QueryResultsRow row : results ) {
    17    Person person = ( Person ) row.get( "person" );
    18    System.out.println( person.getName() + "\n" );
    19}
    

Rule

rule

定义规则,一个规则包含三个部分:属性部分,条件部分(LHS),结果部分(RHS)

1rule "ruleName"

Attributes

no-loop
  • 默认值:false
  • 类型:Boolean
  • 功能: 当true时允许其他规则通过update()更新其相关的Fact对象对规则进行二次执行
ruleflow-group
  • 默认值:N/A
  • 类型:String
  • 功能:Ruleflow是一个Drools功能,可让您控制规则的触发.由相同的规则流组标识汇编的规则仅在其组处于活动状态时触发.将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group属性的值,从而使用对应的规则.
lock-on-active
  • 默认值:false
  • 类型:Boolean
  • 功能:避免Fact对象变更造成的规则二次执行
salience
  • 默认值:0
  • 类型:Integer
  • 功能:设置规则的执行优先级,数字越大优先级越高,可以为负数
agenda-group
  • 默认值:MAIN
  • 类型:String
  • 功能:分组获取焦点执行,没有焦点的情况下,该分组将不执行.
auto-focus
  • 默认值:false
  • 类型:Boolean
  • 功能:规则中写明,当前规则自动获得焦点,不用显示写明焦点,可以实现org.drools.runtime.rule.AgendaFilteraccept方法控制规则是否执行
activation-group
  • 默认值:N/A
  • 类型:String
  • 功能:规则分组,当一组中只要有一个规则被执行,该组的其他规则将不再执行
dialect
  • 默认值:根据package指定
  • 类型:String, “java”or”mvel“
  • 功能:表示用于LHS和RHS代码块中的任何代码表达式的方言.目前有两种方言,javaMVEL.虽然方言可以在包级别指定,但此属性允许为规则覆盖包定义
date-effective
  • 默认值:N/A
  • 类型:字符串,包含日期和时间定义.格式:dd-MMM-yyyy(25-Sep-2009)
  • 功能: 仅当当前日期和时间在设定的时间后面时,才能激活规则.
date-expires
  • 默认值:N/A
  • 类型:字符串,包含日期和时间定义.格式:dd-MMM-yyyy(25-Sep-2009)
  • 功能:仅当当前日期和时间在设定的时间前面时,才能激活规则.
enabled
  • 默认值:true
  • 类型:String
  • 功能:表示规则可以使用,如果手工为规则添加enabled属性,并且设置为false,该规则将不会执行
duration
  • 默认值:无
  • 类型:Long
  • 功能: 将在指定的持续时间之后触发,如果它仍然是true.

条件部分-LHS

定义当前规则的条件,如when Message(); 判断当前workingMemory中是否存在Message对象.

Left Hand SideLHS)是规则的条件部分的公共名称.它由零个或多个条件元素组成.
如果LHS为空,它将被认为是一个条件元素,它总是为真,并且当创建一个新的WorkingMemory会话时,它将被激活一次.

 1    Conditions / LHS —匹配模式(Patterns)
 2
 3    没有字段约束的Pattern
 4    Person()
 5
 6    有文本字段约束的Pattern
 7    Person( name == “bob” )
 8
 9    字段绑定的Pattern
10    Person( $name : name == “bob” )
11    变量名称可以是任何合法的java变量,$是可选的,可由于区分字段和变量
12
13    Fact绑定的Pattern
14    $bob : Person( name == “bob” )字段绑定的Pattern
15
16    变量约束的Pattern
17    Person( name == $name )

Drools提供了十二种类型比较操作符:
> >= < <= == != contains not contains memberOf not memberOf matches not matches

contains

  • 用于检查作为Collection或elements的字段是否包含指定的值
1Cheese( name contains "tilto" )
2Person( fullName contains "Jr" )
3String( this contains "foo" )

not contains

  • contains相反

memberOf

  • 用于检查字段是否是集合的成员或元素;该集合必须是一个变量.
1CheeseCounter( cheese memberOf $matureCheeses )

not memberOf

  • memberOf相反

matches

  • 正则表达式匹配,与java不同的是,不用考虑'/'的转义问题
1Cheese( type matches "(Buffalo)?\\S*Mozarella" )

not matches

  • matches相反

exists

  • 存在.检查Working Memory是否存在某物.使用模式exists,则规则将只激活最多一次,而不管在工作存储器中存在与存在模式中的条件匹配的数据量

not

  • 不存在,检查工作存储器中是否存在某物.

结果部分-RHS

这里可以写普通java代码,即当前规则条件满足后执行的操作,可以直接调用Fact对象的方法来操作应用.

Right Hand SideRHS)是规则的结果或动作部分的通用名称;此部分应包含要执行的操作的列表.在规则的RHS中使用命令式或条件式代码是不好的做法;作为一个规则应该是原子的性质 - “when this, then do this”,而不是“when this, maybe do this”.规则的RHS部分也应该保持较小,从而保持声明性和可读性.如果你发现你需要在RHS中的命令式和/或条件代码,那么也许你应该把这个规则分成多个规则. RHS的主要目的是插入,删除或修改工作存储器数据.为了协助,有一些方便的方法可以用来修改工作记忆;而不必首先引用工作内存实例.

update

  • 更新,告诉引擎对象已经改变(已经绑定到LHS上的某个东西),并且规则可能需要重新考虑.

insert(new Something())

  • 插入,往当前workingMemory中插入一个新的Fact对象,会触发规则的再次执行,除非使用no-loop限定.

insertLogical(new Something())

  • 类似于insert,但是当没有更多的facts支持当前触发规则的真实性时,对象将被自动删除.

modify

  • 修改,与update语法不同,结果都是更新操作.该语言扩展提供了一种结构化的方法来更新事实.它将更新操作与一些setter调用相结合来更改对象的字段.

retract

  • 删除

drools.halt()

  • 调用drools.halt()立即终止规则执行.这是需要将控制权返回到当前会话使用fireUntilHalt()的点.

drools.getWorkingMemory()

  • 返回WorkingMemory对象.

drools.setFocus( String s)

  • 将焦点设置为指定的agenda group.

drools.getRule().getName()

  • 从规则的RHS调用,返回规则的名称.

drools.getTuple()

  • 返回与当前执行的规则匹配的Tuple,而drools.getActivation()传递相应的激活.

标题:drools规则引擎写法
作者:GunVeda
地址:http://gunveda.top/articles/2019/11/05/1572916598836.html