Drools查询和组合查询的返回类型

Drools查询和组合查询的返回类型,drools,Drools,我有一种情况,我需要检查是否有2个类型为a的EOObject。为此,我编写了如下查询: query checkA() $r1 : EObject(eClass().getName() == "A") $r2 : EObject(eClass().getName() == "A",this != $r1) end 如果有3个B型EO对象 query checkB() $r1 : EObject(eClass().getName() == "B" , some_more_constraint

我有一种情况,我需要检查是否有2个类型为a的EOObject。为此,我编写了如下查询:

query checkA()
$r1 : EObject(eClass().getName() ==  "A")
$r2 : EObject(eClass().getName() ==  "A",this != $r1)
end
如果有3个B型EO对象

query checkB()
$r1 : EObject(eClass().getName() ==  "B" , some_more_constraints)
$r2 : EObject(eClass().getName() ==  "B" , some_more_constraints,this != $r1)
$r3 : EObject(eClass().getName() ==  "B" , some_more_constraints,this != $r1,this != $r2)
end
我需要检查是否有2个A型对象或3个B型对象。我有一个规则:

Rule "checking"
when
checkA()
||
checkB()
then
... do_something...
当我运行规则时,它给出了一个ClassCastException异常

如果您能帮助我理解为什么会发生这种情况,并回答以下两个问题,那将非常有帮助。 a) 我如何实现这一点? b) checkA()或checkB()查询的返回类型是什么

如果我从规则中删除“| |”条件,那么它运行良好,没有任何错误


非常感谢

这里有两件重要的事情需要了解:

  • Drools中的查询在规则的
    when
    部分中使用时,不返回值
  • |
    运算符不能像Drools中的常规
    运算符那样工作
  • 规则中的查询 Drools中的查询(不带)在规则的
    when
    部分中使用时,其行为类似于将其中的相同模式复制到规则中

    让我们以以下DRL为例:

    query strings()
      $s1: String()
      String(this != $s1)
    end
    
    rule "Test"
    when
      strings()
    then
      //do something...
    end
    
    在会话中插入2个
    字符串
    s1
    s2
    )时,我们将有2次
    测试
    规则的激活:

    • 激活1:
      [s1,s2]
    • 激活2:
      [s2,s1]
    模式之间的
    当Drools在规则的模式之间找到一个| |时,它基本上会将规则分成两部分。此行为与任何其他编程语言中的常规
    之间的最大区别在于,如果
    操作的两个部分都为true,则该规则将被激活两次

    因此,例如,以下规则:

    rule "Test"
    when
      String(this == "ABC") ||
      String(this == "DEF")
    then
      //Do something
    end
    
    将在运行时创建两个不同的规则:

    rule "Test-1"
    when
      String(this == "ABC")
    then
      //Do something
    end
    
    rule "Test-2"
    when
      String(this == "DEF")
    then
      //Do something
    end
    
    使用
    |
    时的一个问题是,在模式中使用绑定变量时必须非常小心,因为您不知道它们是否包含值

    我猜您的异常实际上是由您如何在规则的when部分绑定变量引起的


    我希望现在您对Drools在使用查询和
    |
    操作符时的工作原理有了更多的了解,您将能够跟踪异常发生的位置和原因