事实存在或不存在时的流口水条件

Drools condition for when fact exists or does not exist

我正在尝试设置一个 drools 规则来实现这样的目标:

rule "Rule 1"
    salience 100
    activation-group "..."
when
    $fact: Fact exists, or fact does not exist
then
    if $fact exists then do X. Else, do Y.

我知道我可以通过两种不同的规则来做到这一点,一种适用于事实存在的情况,一种适用于事实不存在的情况。有什么办法可以将这些条件合二为一吗?对于 when 语句,我试过:

$fact: Fact() || not Fact()

没用。在 drools 中写“when”语句有正确的方法吗?

如果我们恢复为布尔逻辑,A || !Atrue 相同,因此您可以完全省略条件。

您已经正确地做到了这一点。规则 1:如果 X 存在,则执行 A()。规则 2:如果 X 不存在,则执行 B()。这就是正确的做事方式:

rule "Fact exists"
when
  exists(Fact())
then
  doX()
end

rule "Fact does not exist"
when 
  not(Fact())
then
  doY()
end

这是很好的规则设计,以及您应该如何做到这一点。我想不出将其压缩为一个规则的充分理由。如果您可以澄清一个合法的用例,说明为什么要将其合并为一个规则,则可能会给出更好或更具体的响应。

您可以为此滥用 conditional and named consequences,尽管它绝对不是为此设计的(也不推荐。)