Drools规则正在多次运行然后子句



我刚刚开始学习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

当我运行这个规则时,我会在终端中获得三个通过的打印?这是正确的,因为只有三行是真的,但我如何使它处理整个";当";块,然后转到"块";那么";部分

欢呼,

ehsan

如果我去掉";或";在字里行间,我不会得到任何结果。

您的规则实际上没有意义。你有"ands";以及";ors";在这里没有特别的顺序。将事物设置在单独的行上不会产生任何类型的";分组";。相似地,接近并不能提供任何形式的内在关系。";以及";第三行的特别令人困惑——我不知道它们应该是什么。

一般来说,如果你想表示一个";或";条件,你可以这样写条件:

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

(其中"…"表示附加值。(

这读作";有一个"类"的代码为MAT1003MAT1008">

对于";以及";你会有两种不同的说法;只有当两者匹配时,规则才会被"触发"。例如:

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

如果存在至少2〃;类";工作内存中的实例,并且至少有一个代码为MAT1006,并且至少一个代码MAT1010

我使用exists是因为您实际上不需要对匹配实例的引用来在右手边使用;我还推测,无论有多少实例符合你的条件,你只需要触发一次。


最后——我强烈建议不要给你的类命名";类";因为它在Java中是一个保留字。如果它代表某种教育阶级(如大学(,我可以建议称之为课程吗?

最新更新