8、Drools函数的使用详述

注:以下函数都是写在drl的then中
insert 插入
    函数 insert 的作用与我们在 Java 类当中调用 StatefulKnowledgeSession 对象的 insert 方法的作用相同,都是用来将一个 Fact 对象插入到当前的 Working Memory 当中
基本用法格式如下:
insert(new Object());
一旦调用 insert 宏函数,那么 Drools 会重新与所有的规则再重新匹配一次对于没有设 置 no-loop 属性为 true 的规则如果条件满足,不管其之前是否执行过都会再执行一次,这个特性不仅存在于 insert 宏函数上,后面介绍的 update、retract 宏函数同样具有该特性,所以在某些情况下因考虑不周调用 insert、update 或 retract 容易发生死循环

对上例中的详细说明:
    可以看出来,在这个规则引擎中分别定义了两个名为"rule1"与"rule2"。在"rule1"中 when  eval(true) 表示没有任何条件约束,RHS当中创建了一个Customer对象,并设置它的name属性为“张三”,完成后调用 insert 宏函数将其插入到当前的Working Memory当中;在名为rule2这个规则当中,首先判断当前的 Working Memory 当中没有一个name属性的值为“张三”的Customer对象,如果有的话,那么就在其RHS部分将这个 Customer对象的name属性打印出来。
insertLogical   插入
insertLogical 作用与 insert 类似,它的作用也是将一个 Fact 对象插入到当前的 Working M emroy 当中

update   修改功能
    update 函数意义与其名称一样,用来实现对当前 Working Memory 当中的 Fact 进行更新, update宏函数的作用与StatefulSession 对象的 update 方法的作用基本相同,都是用来告诉当前的 Working Memory该Fact对象已经发生了变化。它的用法有两种形式, 一种是直接更新一个Fact对象,另一种 为通过指定 FactHandle 来更新与指定 FactHandle对应的Fact对象, 下面我们就来通过两个实例来说明 update 的这两种用法。 

先来看第一种用法,直接更新一个 Fact 对象。
第一种用法的格式如下: update(new Object()); 
举例说明

详细说明一下上面的例子:
    有两个规则:rule1 和 rule2,在 rule1 当中我们通过使用 insert 宏函数向当前 Working Memory 当中插入了一个 name 属性为“张三”、age 属性为“1”的Person对象;rule2的规则当中首先判断当前的 Working Memory 当中有没有一个 name 属 性为“张三”同时 age 属性值小于“10”的person,如果有的话,那么就重新设置当前这个Person对象的 age 属性的值:将当前 age 属性的值 加 1,然后调用 update 宏函数,对 这个修改后的 Person对象进行更新。
    因为rule1的优先级为 2,所以它会先执行;rule2 的优先级为1,所以它会在 rule1 执行 完成后执行。在第一次 rule1 规则执行完成后,Working Memory 当中就会有一个name属性为“张三”、age 属性为“1”的 Person对象,正好满足 rule2 规则的条件,所以 rule2 的RHS部分会执行,在rule2当中一旦使用update宏函数对Person对象进行了更新,Drools 会重新检查所有的规则,看看有没有条件满足,这时只要 Person对象的age属性值在没有更新的 10 之前 rule2 都会再次触发,直到 Person对象的age属性值更新到大于等于 10, 这时所有的规则执行才算完成。   

第二种用法的格式如下: update(new FactHandle(),new Object()); 

详细说明
    更改了 rule2 的 RHS 部分,在这个部分当中,创建了一个新的 Person对象,并设置了它的 name 属性为“张三”、age 属性为当前 Working Memory 当中的Person对象的age 属性值加1,设置完成后将这个新的 Customer 对象通过使用 update 方法替换了原来的在 Working Memory 当中的 Customer 对象。编写测试类,可以发现运行 结果同前面的结果相同。 在这个规则当中我们使用了一个名为 drools 的宏对象,通过该对象获取当前的 Working Memory对象,再通过 WorkingMemory 得到指定的 Fact 对象的 FactHandle。

还有一种修改方法:

上面这种修改方法 modify的参数是必须在when中有的,否则会报错。


retract   删除功能

和 kession的 retract 方法一样,宏函数 retract 也是用来将 Working Memory 当中 某个 Fact 对象从 Working Memory 当中删除,下面就通过一个例子来说明 retract 宏函数的用法

详细说明以上功能:
有两个规则和前面的示例基本相同,在 rule2 当中 RHS 部分,通过使用 retract 宏函数对符合条件的 Customer 对象进行了删除,将其从当前的 Working Memory 当中清除,这样在执行完所有的规则之后,调用名为“query fact count”的 query 查询,查 询到的结果数量应该是 0
输出结果

正如推理的那样,因为使用了 retract 将 Customer 对象从当前的 Working Memory 当中 删除,所以运行结果中看到的 Customer 对象的数目为 0。 
注:在6.X版本中, 我们也可以通过delete的方式进行删除,其功能与retract是一样的。

drools     宏对象  和java中的类一样,可以通过drools 来获取里面的属性方法。
想要在规则文档里获取更多的实现对当前的 Working Memory 控制,那么可以使用 drools 宏对象实现,通过使用 drools 宏对象可以实现在规则文件里直接访问 Working Memory。在前面介绍 update 宏函数的时候我们就使用 drools 宏对象来访问当前的 Working Memory,得到一个指定的 Fact 对象的 FactHandle。同时前面介绍的 insert、insertLogical、 update 和 retract 宏函数的功能皆可以通过使用 drools 宏对象来实现。
举例说明:
普通宏函数

drools 宏函数


两个规则写法不同,但实现的效果是一样的。
以下是drools常用的方法

下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的

----请看下方↓↓↓↓↓↓↓

百度搜索 Drools从入门到精通:可下载开源全套Drools教程

深度Drools教程不段更新中:


更多Drools实战陆续发布中………

扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值