当一个人使用 "in" 运算符时,drools 事实检查是什么(何时)return

What does a drools fact check (when) return when one uses the "in" operator

我有以下规则

rule One
 when
    vg1 : Vgdoc(code() in ("IA1003", "IA1004"), colour == "red")
 then
     .. do something with vg1
end

当我在 then 子句中使用 vg1 时,我看到它代表一个对象,但如果两个 ("IA1003"、"IA1004") 都存在怎么办?流口水只发送第一个还是两个?如果它同时发送了我如何检查它。

是否可以对

做这样的事情
vglist : List() from collect (Vgdok(code() in ("IA1003", "IA1004")))

如果内存中存在这两个事实,此列表是否会包含这两个事实?

干杯

es

您的规则将命中工作记忆中匹配的每个项目。

为简化起见,假设您的模型如下所示:

class Vgdoc {
  public String getCode() { ... }
  public String getColour() { ... }
}

你的规则就像你拥有的一样,语法更正:

rule "One"
when
  vg1: Vgdoc( code in ("IA1003", "IA1004"),
              colour == "red" )
then
  Systen.out.println("Rule 1 fired");
end

并且您在工作内存中有对象:

Vgdoc{ code: "IA1003", colour: "red" } // A
Vgdoc{ code: "IA1004", colour: "red" } // B
Vgdoc{ code: "IA1005", colour: "red" } // C
Vgdoc{ code: "IA1003", colour: "blue" } // D

那么您的规则将触发两次,一次针对我评论为“A”的项目,一次针对我评论为“B”的项目。 (例如,将打印 Rule 1 fired 的两个实例。)它不会触发注释为“C”的项目,因为代码不匹配,也不会触发注释为“D”的项目,因为颜色字段匹配不匹配。

现在,如果您只想触发一次并使用符合条件(颜色 'red' 和代码 'IA1003' 的所有 Vgdoc 的 集合 ] 或 'IA1004'),那么是的,您将使用收集。像这样:

rule "IA1003 and IA1004 with red"
when
  vgList: List() from collect( Vgdoc( code in ("IA1003", "IA1004"), colour == "red" ))
then
  System.out.println("Rule fired, match count: " + vgList.size());
  // vgList will contain all items that match the conditions for code and colour
end

这个版本的规则,与之前的输入相同,将恰好触发一次并打印:Rule fired, match count: 2.

您选择使用哪一个取决于您的用例。