【问题标题】:Drools condition for when fact exists or does not exist事实存在或不存在时的流口水条件
【发布时间】:2021-04-22 19:12:23
【问题描述】:

我正在尝试设置一个可以实现以下目标的流口水规则:

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”语句?

【问题讨论】:

    标签: drools


    【解决方案1】:

    如果我们恢复为布尔逻辑,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,尽管它绝对不是为此设计的(也不推荐)。

    【讨论】:

    • 确实如此。基本上,我在这条规则中对不同的事实有一堆条件,在“then”部分有一些复杂的逻辑。我想根据是否存在新事实,在“then”部分做一些稍微不同的事情。必须为此创建两条规则会导致大量代码重复,我宁愿在这条规则中只做一个简单的“如果事实存在则做 X,否则做 Y”。
    • 您可能应该将复杂的逻辑从 then 部分移到 when (如果它们是条件......附带的好处将是加快处理速度)或您可以使用的函数中根据需要从多个规则的 RHS 调用。
    • @RoddyoftheFrozenPeas 所说的完全正确。保持 when 和 then 部分尽可能小,您会从规则系统中获得所有好处
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多