规则引擎drools学习-day02

规则与方法以及叉积

规则和方法的比较

方法特点

  • 方法被直接调用。
  • 传递了特定实例。
  • 一个调用导致一次执行。
public void helloWorld(Person person) {
 if ( person.getName().equals( "Chuck" ) ) {
 	System.out.println( "Hello Chuck" );
 }
}

规则

  • 只要将数据插入引擎中,规则就会通过匹配任何数据来执行。
  • 规则永远不能直接调用。
  • 特定实例无法传递到规则。
  • 根据匹配规则的不同,规则可能会触发一次或多次,甚至根本不会触发。
rule "Hello World" when
 Person( name == "Chuck" )
then
 System.out.println( "Hello Chuck" );
end

叉积

前一个火警案例中如果房屋和花洒喷头结合如下规则使用

rule "Show Sprinklers" when
 $room : Room()
 $sprinkler : Sprinkler()
then
 System.out.println( "room:" + $room.getName() +
 " sprinkler:" + $sprinkler.getRoom().getName() );
end

用SQL术语来说就像这样做select * from Room, Sprinkler,Room表中的每一行都将与Sprinkler表中的每一行连接在一
起,从而产生以下输出:

room:office sprinkler:office
room:office sprinkler:kitchen
room:office sprinkler:livingroom
room:office sprinkler:bedroom
room:kitchen sprinkler:office
room:kitchen sprinkler:kitchen
room:kitchen sprinkler:livingroom
room:kitchen sprinkler:bedroom
room:livingroom sprinkler:office
room:livingroom sprinkler:kitchen
room:livingroom sprinkler:livingroom
room:livingroom sprinkler:bedroom
room:bedroom sprinkler:office
room:bedroom sprinkler:kitchen
room:bedroom sprinkler:livingroom
room:bedroom sprinkler:bedroom

这些交叉乘积显然会变得巨大,并且很可能包含虚假数据。对于初学规则引擎的人而言,交叉结果的大小通常是性能问题的根源。由此可见,总是需要约束叉积,这是通过变量约束来完成的。如下:

rule
when
 $room : Room()
 $sprinkler : Sprinkler( room == $room )
then
 System.out.println( "room:" + $room.getName() +
 " sprinkler:" + $sprinkler.getRoom().getName() );
end

这 样 仅 产 生 四 行 数 据 , 每 个 房 间 都 有 正 确 的 自 动 喷 水 灭 火 器 。 在 SQL ( 实 际 上 是 HQL ) 中 , 对 应 的 查 询 为
select * from Room, Sprinkler where Room == Sprinkler.room。

room:office sprinkler:office
room:kitchen sprinkler:kitchen
room:livingroom sprinkler:livingroom
room:bedroom sprinkler:bedroom
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值