Drools 规则是 运行 then clause multiply times

Drools rule is running then clause multiply times

刚开始学习Drools,写了如下规则

rule "matematikk"
 when
  class( code == "MAT1003") or class( code == "MAT1008")
  or
  class( code == "REA3022") or class( code == "REA3024") or class( code == "REA3026") or class( code == "REA3028")
  or
  class(code == "MAT1006") and class(code == "MAT1010") or class( code == "MAT1001") and class( code == "MAT1005")
  or
  class(code == "MAT1002") or class(code == "MAT1007")
then
  logger.info("passed");
end

当我运行这条规则时,我会在终端中得到三个通过的打印件吗?这是正确的,因为只有三行是真的,但我如何让它处理整个“when”块,然后转到“then”部分。

干杯,

埃山

此外,如果我删除行之间的“或”,我将不会得到任何结果。

您的规则没有任何意义。你在这里没有特定顺序地混淆了“ands”和“ors”。在单独的行上设置内容不会创建任何类型的“分组”。接近度同样不提供任何类型的内在关系。第三个 'line' 上的“and”特别令人困惑——我不知道它们应该是什么和-ing。

一般来说,如果你想表示一个“或”条件,你会这样写条件:

class( code in ("MAT1003", "MAT1008", ... ))

(其中“...”表示附加值。)

这被解读为“有一个 'class',其代码为 MAT1003MAT1008”。

对于“和”,您只需要两个不同的语句;只有当两者都匹配时,规则才会是 'triggered'。例如:

exists(class(code == "MAT1006"))
exists(class(code == "MAT1010"))

如果工作内存中至少有 2 个“class”实例,并且至少有一个代码为 MAT1006,并且至少有一个代码为代码 MAT1010.

我使用 exists 是因为您实际上不需要对匹配实例的引用以在右侧使用;我还假设你只需要触发一次,不管有多少实例符合你的条件。


最后 -- 我 强烈 建议不要将您的 class 命名为“class”,因为它是 Java 中的保留字。如果它代表某种教育 class(例如在大学),我可以建议将其称为 Course 吗?