事实存在或不存在时的Drools条件

事实存在或不存在时的Drools条件,drools,Drools,我正在尝试建立一个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. 我知道我可以通过两个不同的规则来做到这一点,一个是关于事实存在时的规则,另一个是关于

我正在尝试建立一个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 | |!A
true
相同,因此可以完全忽略该条件

你已经做对了。规则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
这是一个很好的规则设计,你应该如何做到这一点。我想不出一个好的理由把它压缩成一条规则。如果你能澄清一个合理的用例,解释为什么你想把它分解成一个单一的规则,那么就有可能给出一个更好或更具体的响应


您可能会滥用它,尽管它肯定不是为此而设计的(也不推荐)。

确实如此。基本上,我在这个规则中有一系列不同事实的条件,在“then”部分有一些复杂的逻辑。根据是否存在新的事实,我想在“then”部分做一些稍微不同的事情。必须为此创建两个规则会导致大量代码重复,我更希望能够在此规则中执行一个简单的“如果事实存在,那么执行X,否则执行Y”。您可能应该将复杂的逻辑从then部分移到when部分(如果它们是条件句…附带的好处是加快处理速度)或者可以根据需要从多个规则的RHS调用函数。@roddyOfFrozenpeas所说的完全正确。将when和then部分尽可能小,您就可以从规则系统中获得所有好处