Drools查询和组合查询的返回类型
我有一种情况,我需要检查是否有2个类型为a的EOObject。为此,我编写了如下查询: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
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()查询的返回类型是什么
如果我从规则中删除“| |”条件,那么它运行良好,没有任何错误
非常感谢 这里有两件重要的事情需要了解:
when
部分中使用时,不返回值|
运算符不能像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在使用查询和
|
操作符时的工作原理有了更多的了解,您将能够跟踪异常发生的位置和原因