当前位置: 首页 > 知识库问答 >
问题:

Drools-使用事实类的嵌套规则

皇甫树
2023-03-14

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

我想知道的是——有没有保证“年龄和性别女性”在“怀孕”之前执行,“怀孕”在“怀孕2”之前执行?据我所知,我的申请中总是这样。但是,它是记录在口水留档的某个地方,还是只是等待倒塌的纸牌屋?

    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 

提前感谢您的帮助

编辑:当我不得不添加一条新规则时,我的问题就出现了,比如说“不怀孕”,当这个人还没有怀孕时,我必须做些什么(person==$p)。推理原则有时不起作用(如预期的那样)。因为,有时,“不怀孕”规则会先执行,然后才发现这个人怀孕了,也就是说,“怀孕”后来会变为现实。但“未怀孕”的结果已经出现。

那么,对于如何克服这个问题有什么建议吗?

共有1个答案

翟曦
2023-03-14

无法保证规则全部匹配时的计算顺序。但是,在上面的示例中,顺序是以最佳方式强制执行的。

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

第二条规则不会激活,直到工作记忆中有一个人和一个名为CouldHaveBeenPregnant的事实,它引用了这个人。CouldHaveBeenPregnant只有在规则1激活并插入它时才会在工作记忆中。

同样,只有当有具有匹配属性的人和引用该人的hasbeenpregant事实时,第三条规则才会激活。hasbeenpregant事实仅由第二条规则插入。

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

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

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

 类似资料:
  • 假设我们在JavaEE应用程序中有这些类,它们也是Hibernate实体: 在过去几年中,创建了一些Swing窗口,让配置器用户创建ad deploy DRools软件包规则,以自定义客户所需的工作流。这些窗口以某种方式将Swing组件转换为Drool Mvel文本,以避免配置程序用户编写原始代码。然后将这些规则保存并部署到BLOB字段中的DB表中,并在需要时执行。问题是,现在我们需要实现一个新的

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例

  • 我对口水很陌生,从基础开始。这是一个设置; > 有一些规则文件 不同文件中的规则属于不同的议程组 所有规则都基于同一事实 在我的单元测试中,我获得了一个特定的“议程组”,设置焦点(

  • 主要内容:Java11 嵌套类的示例,输出结果为Java 11 引入了嵌套类的概念,我们可以在类中声明一个类。这种类的嵌套允许在一个地方对要使用的类进行逻辑分组,使它们更具可读性和可维护性。嵌套类可以有四种类型 - 静态嵌套类 非静态嵌套类 本地类 匿名类 Java 11 还提供了嵌套的概念,以允许嵌套类的通信和验证。 Java11 嵌套类的示例 ApiTester.java 输出结果为  

  • 我是规则引擎新手,我的应用程序需要从文件系统动态加载xml文件中的规则,因为管理员可以在运行时创建规则。(Java) 我的问题是:有没有可能流口水?如果是,那么请分享知识,如果不是,那么还有其他选择吗?