'from', 'accumulate' 和 'collect' 之间的关联<o:p></o:p>
作者: Mark Proctor <o:p></o:p>
在Drools4.0中,我们介绍了‘from’关键字,它允许你为模式声明一个推论的来源。这允许引擎使用不在Working Memory中的数据进行推论。源数据可能是绑定变量的子字段,或者方法调用的结果;后一种方式提供了与Hibernate集成的方法(通过调用命名的查询),Drools将把返回的结果与模式统一为一体。<o:p></o:p>
这里是一些简单的绑定子字段进行推论的例子:<o:p></o:p>
Person( personAddress : address )
address : Address( zc : zipcode == "23920W") from personAddress<o:p></o:p>
利用Drools引擎提供的新的表示方法带来的灵活性,你可以用很多办法来解决这个问题。下面是同样的结果,但是用“.”来实现。<o:p></o:p>
p : Person( )
address : Address( zc : zipcode == "23920W") from p.address<o:p></o:p>
当然,我们也可以使用新的表达式语言扩展来完成:<o:p></o:p>
Person( zc : address.zipCode == "2392OW")<o:p></o:p>
下一个例子举例如何在一个hibernate查询结果上进行推论,Restaurant模式将依次在每一个结果上进行推论和绑定。<o:p></o:p>
p : Person( )
Restaurant( food == p.favouriteFood )
from hs.getNamedQuery( "list restaurants by postcode" )
.setProperties( [ "postcode" : p.address.zipcode ] )
.list()<o:p></o:p>
'collect' 和 'accumulate' 在一个返回的对象上计算结果,这种模式可以指定‘from’作为它的源。'collect'允许对集合推论并且返回对象列表。'accumulate'允许对集合中每一个数据项执行操作,匹配给定模式并且执行操作返回用户选择的对象——通常用来求和或汇总数据,当然也可以用来做更复杂的工作。 <o:p></o:p>
<o:p> </o:p>
示例将两个from连在一起使用。它绑定所有购买的每样东西(item)的价值都超过10元的Customer(客户),items是Customer的字段,没有设置在Working Memory中。
c : Customer()
items : List( size == c.items.size )
from collect( Item( price > 10 ) from c.items )<o:p></o:p>
这里的List是从collect产生的,其中有size的属性。<o:p></o:p>
如果这里的items不是Customer的字段,但被设置到working memory中,我们可以使用一个相互关联的‘collect’模式。<o:p></o:p>
p : Customer ()
list : List()
from collect( Item( owner : p ) ) // 找到拥有者是p的所有Item
items : List(size == list.size)
from collect( Item( price > 10 ) from list )<o:p></o:p>
下面是如何使用'accumulate'达到同样的效果,它建立在'count'函数中;虽然这不与'from'举例关联,在这里将它做为一个补充。<o:p></o:p>
p : Person()
count : Number()
from accumulate( i : Item( owner == p ), count( i ) )
list : List( size == count )
from collect( Item( owner == p, price > 10 ) )<o:p></o:p>
对于更复杂的情况——深奥但是更具说明性,我们可以看下面的‘from’例子。对每一个Store(商店),购物的Person(顾客)有一个account(账目),我们返回Person在Store中所有购买的商品,并检查是否这些商品的价值平均超过50元的客户Person。<o:p></o:p>
p : Person()
s : Store( accountOwner == p )
a : Number( intValue > 50 )
from accumulate( item : Item( )
from collect( Item( store == s )
from hs.getNamedQuery( "get user items in store" )
.setProperties( [ "store" : s.name, "owner" : p.name ] )
.list() ),
average( item.price ) )<o:p></o:p>
因此对于那些Rete不能处理集合和嵌套或者working memory外的数据的说法,我希望这些可以让你改变想法。<o:p></o:p>
<o:p></o:p>
<o:p> </o:p>
分享到:
相关推荐
drools-示例:Drools:规则引擎
drools drools drools drools drools
Drools是一个业务规则管理系统,具有基于前向链接和后向链接推理的规则引擎,可以快速,可靠地评估业务规则和进行复杂的事件处理。 规则引擎还是创建专家系统的基本构建块,在人工智能中,该专家系统是模拟人类专家...
简单流口水 Drools 中的一些实验
Drools4.0官方使用手册(中文).pdf
Drools开发最全中文版技术指南。 Drools开发最全中文版技术指南,介绍了常见的drools如何进行开发,注意是:中文版中文版中文版! drools 中文文档 规则引擎 drools6 drools7 Java
Drools引擎的简单演示。 它分析整数(例如,它标识数字是“完美”还是质数等)。 目的是演示如何使用Drools引擎功能,没有目标为该任务实施最有效的解决方案:-)。 该演示还包括在两个单独的规则集中实现的两个部分...
你好Drools 示例项目
流口水 Drools 实验项目 基本上是一个数字游乐场,可以试验使用 Drools、Hibernate、Tomcat 和各种其他技术。
drools最新版本学习资料,里面系统的介绍了drools规则引擎的简介以及集成到项目的教程内容。欢迎下载,收集不易,欢迎点赞。
流口水示例Drools 规则引擎示例。
Lambda示例要构建Lambda,“包描述符”“ template.yaml”是必需的。 请记住,在JVM离开实例之前,实现“ RequestStreamHandler”的类将是“ Singleton”(杀死)。 AWSTemplateFormatVersion : 2010-09-09Transform...
Drools规则引擎样本
drools_map_service Drools 地址解析器 作为服务器运行 南街
Drools7_PDF教程 Drools中文文档 内容全面。 1. 内容更加全面,更多细节,更多知识点全部在新版本中有所体现,并且会附上小编做的例子 ,更多内容不断更新中 2. 目前国内最全的Drools中文文档。也是目前国内唯一一本
Drools中文使用教程 Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已...
drools中文文档pdf完整版本,drools 新版本功能,技术开发细节及api说明
游泳池 Drools Proj
drools开发中文文档!
开发Drools和jBPM 如果要构建或参与kiegroup项目,请。 通过正确设置您的开发环境,它将为您和我们节省大量时间。 它解决了可能会破坏您的开发的所有已知陷阱。 它还描述了所有准则,技巧和窍门。 如果您希望将拉取...