我意识到这个标题很疯狂,但它确实是我能想到的最好的。如果有人有更好的建议,请在评论中留下,我会编辑。
这个问题是这里所问问题的后续问题:在集合中发现了除p之外的Drools约束对象
对于那些不想点击的人,这篇文章描述了解决方案,在这种情况下,你想知道是否存在CustomType的成员字段包含p以外的值。这个问题的解决方案最终如下:
$c: CustomType()
exists Object(this != objectP) from $c.collection
上面的代码非常有效。我的问题是,我想知道何时不存在具有此属性的CustomType类型的对象。现在,由于第2行依赖于第1行中给定的绑定变量,我们不能简单地用not运算符否定第1行。这样做会引发运行时异常。以下是我直觉上想要编写代码的方式,但请记住它不起作用:
not $c: CustomType()
exists Object(this != objectP) from $c.collection
我不能简单地否定第2行,因为这样规则将要求至少存在一个CustomType对象。我想知道什么时候第一个代码示例不是这样。
我内心的口水告诉我,最初的解决方案可能有缺陷。理想情况下,我们希望在CustomType的括号()中表达第2行。这将更像是"有一个带有属性的CustomType",而不是"有一种CustomType,有一个具有属性的Object"。前者我们可以用not运算符来否定,但我不知道该如何处理后者。
当你需要处理这样的约束时,这些约束需要用多行来表达,以及它们的否定,我认为你正在进入推理和真相维护的世界:
http://blog.athico.com/2010/01/drools-inference-and-truth-maintenance.html
即,您的规则可能类似于:
rule "Determine presence of non-P objects" when
$c: CustomType()
exists Object(this != objectP) from $c.collection
then
insertLogical( new ContainsNonP($c) );
end
rule "There are some non-P objects" when
$c: CustomType()
exists ContainsNonP(customType == $c)
then
...
end
rule "There are no non-P objects" when
$c: CustomType()
not exists ContainsNonP(customType == $c)
then
...
end
注意,如果第一规则尚未激活,则上述最终规则可能会激活。如果激活的顺序对你的规则很重要,你可能希望定义一些显著性。