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',其代码为 MAT1003 或 MAT1008”。
对于“和”,您只需要两个不同的语句;只有当两者都匹配时,规则才会是 'triggered'。例如:
exists(class(code == "MAT1006"))
exists(class(code == "MAT1010"))
如果工作内存中至少有 2 个“class”实例,并且至少有一个代码为 MAT1006,并且至少有一个代码为代码 MAT1010.
我使用 exists
是因为您实际上不需要对匹配实例的引用以在右侧使用;我还假设你只需要触发一次,不管有多少实例符合你的条件。
最后 -- 我 强烈 建议不要将您的 class 命名为“class”,因为它是 Java 中的保留字。如果它代表某种教育 class(例如在大学),我可以建议将其称为 Course 吗?
刚开始学习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',其代码为 MAT1003 或 MAT1008”。
对于“和”,您只需要两个不同的语句;只有当两者都匹配时,规则才会是 'triggered'。例如:
exists(class(code == "MAT1006"))
exists(class(code == "MAT1010"))
如果工作内存中至少有 2 个“class”实例,并且至少有一个代码为 MAT1006,并且至少有一个代码为代码 MAT1010.
我使用 exists
是因为您实际上不需要对匹配实例的引用以在右侧使用;我还假设你只需要触发一次,不管有多少实例符合你的条件。
最后 -- 我 强烈 建议不要将您的 class 命名为“class”,因为它是 Java 中的保留字。如果它代表某种教育 class(例如在大学),我可以建议将其称为 Course 吗?