drools-规则引擎语法

Drools语法-Language

关键词

Pakage

  • package

    package表示一个命名空间.package是必须定义的,必须放在规则文件第一行.

  • import

    import语句的工作方式类似于Java中的import语句。您需要为要在规则中使用的任何对象指定完全限定路径和类型名称。

  • global

    global用于定义全局变量。

    Rules:

    global java.util.List myGlobalList;
    
    rule "Using a global"
    when
      eval( true )
    then
      myGlobalList.add( "Hello World" );
    end
    

    Set the global value:

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

Function

  • function

    function是一种将语义代码放置在规则源文件中的方法,而不是普通的Java类

    function String hello(String name) {
      return "Hello "+name+"!";
    }
    import function my.package.Foo.hello
    rule "using a static function"
    when
      eval( true )
    then
      System.out.println( hello( "Bob" ) );
    end
    

Query

  • query

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

    对所有30岁以上的人的简单查询
    query "people over the age of 30"
        person : Person( age > 30 )
    end
    
    查询超过x岁的人,以及居住在y的人
    query "people over the age of x"  (int x, String y)
        person : Person( age > x, location == y )
    end
    
    QueryResults results = ksession.getQueryResults( "people over the age of 30" );
    System.out.println( "we have " + results.size() + " people over the age  of 30" );
    
    System.out.println( "These people are are over 30:" );
    
    for ( QueryResultsRow row : results ) {
        Person person = ( Person ) row.get( "person" );
        System.out.println( person.getName() + "\n" );
    }
    

Rule

rule定义规则。rule "ruleName"

一个规则可以包含三个部分:属性部分,条件部分:即LHS,结果部分:即RHS.

image

属性部分-Attributes

定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等。
activation-group agenda-group auto-focus date-effective date-expires dialect duration duration-value enabled lock-on-active no-loop ruleflow-group salience

[图片上传失败...(image-26f804-1526628115111)]

  • no-loop

    默认值:false

    类型:Boolean

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

  • ruleflow-group

    默认值:N/A

    类型:String

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

  • lock-on-active

    默认值:false

    类型:Boolean

    当在规则上使用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 属性的时候

  • salience

    默认值:0

    类型:integer

    设置规则执行的优先级,salience 属性的值是一个数字,数字越大执行优先级越高,同时它的值可以是一个负数.
    规则的salience 默认值为0,所以如果我们不手动设置规则的salience 属性,那么它的执行顺序是随机的.

  • agenda-group

    默认值:MAIN

    类型:String

    规则的调用与执行是通过StatelessSessionStatefulSession 来实现的,一般的顺序是创建一个StatelessSessionStatefulSession,将各种经过编译的规则的package 添加到session当中,接下来将规则当中可能用到的Global对象和Fact对象插入到Session 当中,最后调用fireAllRules 方法来触发、执行规则。在没有调用最后一步fireAllRules方法之前,所有的规则及插入的Fact对象都存放在一个名叫Agenda表的对象当中,这个Agenda表中每一个规则及与其匹配相关业务数据叫做Activation,在调用fireAllRules方法后,这些Activation 会依次执行,这些位于Agenda 表中的Activation 的执行顺序在没有设置相关用来控制顺序的属性时(比如salience 属性),它的执行顺序是随机的,不确定的。Agenda Group 是用来在Agenda 的基础之上,对现在的规则进行再次分组,具体的分组方法可以采用为规则添加agenda-group属性来实现。agenda-group 属性的值也是一个字符串,通过这个字符串,可以将规则分为若干个Agenda Group,默认情况下,引擎在调用这些设置了agenda-group 属性的规则的时候需要显示的指定某个Agenda Group 得到Focus(焦点),这样位于该Agenda Group 当中的规则才会触发执行,否则将不执行。

  • auto-focus

    默认值:false

    类型:Boolean

    用来在已设置了agenda-group的规则上设置该规则是否可以自动独取Focus,如果该属性设置为true,那么在引擎执行时,就不需要显示的为某个Agenda Group设置Focus,否则需要。对于规则的执行的控制,还可以使用Agenda Filter 来实现。在Drools 当中,提供了一个名为org.drools.runtime.rule.AgendaFilter 的Agenda Filter 接口,用户可以实现该接口,通过规则当中的某些属性来控制规则要不要执行。org.drools.runtime.rule.AgendaFilter 接口只有一个方法需要实现,方法体如下: public boolean accept(Activation activation); 在该方法当中提供了一个Activation 参数,通过该参数我们可以得到当前正在执行的规则对象或其它一些属性,该方法要返回一个布尔值,该布尔值就决定了要不要执行当前这个规则,返回true 就执行规则,否则就不执行。

  • activation-group

    默认值:N/A

    类型:String

    该属性的作用是将若干个规则划分成一个组,用一个字符串来给这个组命名,这样在执行的时候,具有相同activation-group属性的规则中只要有一个会被执行,其它的规则都将不再执行。也就是说,在一组具有相同activation-group属性的规则当中,只有一个规则会被执行,其它规则都将不会被执行。当然对于具有相同activation-group属性的规则当中究竟哪一个会先执行,则可以用类似salience之类属性来实现。

  • dialect

    默认值: 根据package指定

    类型:String,"java" or "mvel"

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

  • date-effective

    默认值:N/A

    类型:字符串,包含日期和时间定义。格式:dd-MMM-yyyy(25-Sep-2009).

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

  • date-expires

    默认值:N/A

    类型:字符串,包含日期和时间定义。格式:dd-MMM-yyyy(25-Sep-2009).

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

  • enabled

    默认值:false

    类型:String

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

  • duration

    默认值:无

    类型:long

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

条件部分-LHS

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

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

    Conditions / LHS —匹配模式(Patterns)

    没有字段约束的Pattern
    Person()

    有文本字段约束的Pattern
    Person( name == “bob” )

    字段绑定的Pattern
    Person( $name : name == “bob” )
    变量名称可以是任何合法的java变量,$是可选的,可由于区分字段和变量

    Fact绑定的Pattern
    $bob : Person( name == “bob” )字段绑定的Pattern

    变量约束的Pattern
    Person( name == $name )

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

  • contains

    运算符contains用于检查作为Collection或elements的字段是否包含指定的值.

    Cheese( name contains "tilto" )
    Person( fullName contains "Jr" )
    String( this contains "foo" )
    
  • not contains

    contains相反

  • memberOf

    运算符memberOf用于检查字段是否是集合的成员或元素;该集合必须是一个变量。

    CheeseCounter( cheese memberOf $matureCheeses )
    
  • not memberOf

    memberOf相反

  • matches

    正则表达式匹配,与java不同的是,不用考虑'/'的转义问题

    Cheese( type matches "(Buffalo)?\\S*Mozarella" )
    
  • not matches

    matches相反

其他条件元素:

  • exists

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

  • not

    不存在,检查工作存储器中是否存在某物。认为“not”意味着“there must be none of...”。

结果部分-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

    删除

一些内置的method。

  • drools.halt()

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

  • drools.getWorkingMemory()

    返回WorkingMemory对象.

  • drools.setFocus( String s)

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

  • drools.getRule().getName()

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

  • drools.getTuple()

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 一. 简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的...
    码农梦醒阅读 2,203评论 1 6
  • 概述(Overview) 以.drl为扩展名的文件,是Drools中的规则文件,规则文件的编写,遵循Drools规...
    老羊_肖恩阅读 41,696评论 4 31
  • 规则引擎 相关介绍 规则引擎起源于基于规则的专家系统,而基于规则的专家系统又是专家系统的其中一个分支。专家系统属于...
    xiaolyuh阅读 22,701评论 1 12
  • Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法对所编写的规则求值。Drools 允...
    九都散人阅读 15,430评论 1 17
  • “我那么辛苦,洗衣做饭当老妈子一样的伺候你们。长胖了,也怪我。作业本不见了,也怪我。红领巾丢了还是怪我。怪我怪我你...
    一溪风月阅读 258评论 4 6