Drools - 使用事实类嵌套规则

时间:2013-11-15 15:21:26

标签: drools rule-engine business-rules

这篇文章建议添加一些事实类作为嵌套规则的一种方式。 http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681

我想知道的是 - 是否保证“年龄和性别女性”在“怀孕2”之前执行,“怀孕2”之前执行“怀孕”? 到目前为止,我已经注意到在我的应用程序中始终如此。但是,它是在drools文档中的某处记录还是只是等待崩溃的纸牌屋?

    rule "Age and gender women" 
    when 
        $p : Person(p1 >= 12 && p2 = 1) 
    then 
        insertLogical( new CouldHaveBeenPregnant($p) ); 
end 

rule "Pregnant" 
    when 
        $p : Person(p3 > 1) 
        CouldHaveBeenPregnant( person == $p ) 
    then 
        insertLogical( new HasBeenPregnant($p) ); 
end 

rule "Pregnant2" 
    no-loop 
    when 
        $p : Person(p4 <= P3) 
        HasBeenPregnant( person == $p ) 
    then 
        $p.setStatus("OK"); 
        update($p); 
end 

提前感谢您的帮助

修改 当我必须添加一条新规则时,我的问题出现了,比如说“不怀孕”,当人不是HasBeenPregnant(person == $ p)时,我必须做些什么。推理原理有时不起作用(如预期的那样)。因为,有时候,“非怀孕”规则首先被执行,后来证明该人怀孕了,即“怀孕”后来变得真实。但“未怀孕”的结果已经开始。

那么,有关如何克服这个问题的任何建议吗?

1 个答案:

答案 0 :(得分:1)

无法保证在所有规则匹配时评估规则的顺序。但是,在上面的示例中,订单以最佳方式被强制执行。

当具有适当属性的工作记忆中存在Person事实时,将激活第一条规则。

第二条规则不会激活,直到工作记忆中的人一个名为CouldHaveBeenPregnant的事实来引用该人。当规则1已激活并插入时,HasHaveBeenPregnant仅在工作记忆中。

同样,第三条规则仅在有匹配属性的人参与该人的HasBeenPregnant事实时激活。 HasBeenPregnant事实仅由第二条规则插入。

即。规则3直到规则2之后才能激活,规则2直到规则1之后才能激活。

这就是所谓的“推理”,是良好规则设计的重要工具。 Mark Proctor(Drools领导)在这里写了一篇很好的博客文章:

http://blog.athico.com/2009/11/what-is-inference-and-how-does-it.html