Drools约束对象不存在,其成员字段包含P以外的值

时间:2013-11-23 00:56:26

标签: operators constraints drools negation

我意识到标题很疯狂,但它确实是我能想到的最好的。如果有人有更好的建议请留在评论中,我会编辑。

此问题是对此处提出的问题的跟进:Drools Constraint object other than P is found in collection

对于那些不想点击的人,该帖子描述了你想知道的情况的解决方案,如果有一个CustomType的事实,其成员字段包含除P以外的值。该问题的解决方案最终成为以下内容:

$c: CustomType()
exists Object(this != objectP) from $c.collection

以上代码效果很好。我的问题是我想知道什么时候不存在具有此属性的CustomType类型的对象。现在,由于第2行依赖于第1行中给出的绑定变量,因此我们不能简单地用非运算符否定第1行。这样做会引发运行时异常。以下是我直觉性地想要编写代码的方法,但请记住它不起作用:

not $c: CustomType()
exists Object(this != objectP) from $c.collection

我不能简单地否定第2行,因为这时规则要求至少存在一个CustomType对象。我想知道第一个代码示例何时不是这样。

我内心的流氓告诉我原来的解决方案可能存在缺陷。理想情况下,我们希望在CustomType的括号()内表达第2行。这将更多地表达“有一个带有属性的CustomType”而不是“有一个CustomType,并且有一个具有属性的Object”。前者我们可以用非运算符否定,但我不确定如何处理后者。

1 个答案:

答案 0 :(得分:2)

当你需要处理这些需要用多行表达的约束以及否定它们时,我认为你正在进入推理和真理维护的世界:

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

请注意,如果尚未激活第一条规则,则上述最终规则可能会激活。如果激活顺序对您的规则很重要,您可能希望定义一些显着性。