流氓规则取决于JDK Map中的知识(不在非JDK类中)

2022-09-03 13:56:16

我正在尝试编写以下规则,这取决于下面提供的知识,该知识仅使用JDK [库]映射(而不是非库类中的映射)。但它似乎不起作用...main

主要方法:

Map<String, Float> mapa = new HashMap<String, Float>();
mapa.put("Height", (float)1.73);
mapa.put("Weight", (float)79.0);
mapa.put("BMI", mapa.get("Weight") /
                (mapa.get("Height") * mapa.get("Height")));
ksession.insert(mapa);

rule.drl:

rule "Low BMI"
    when
        $map : (Map(values("BMI")) < 18.0)
    then 
        System.out.println("You have a low BMI");
end

我想比较规则前提条件内的BMI值,如果这个条件为真,所以我想在下面显示消息。

怎么了?


答案 1

你应该写这样的东西:

when
    $map: Map(this["BMI"] < 18)
then

它应该:)


答案 2

一般而言,请参阅 Drools 文档 7.8.3.3.10。列表和地图访问部分...

FWIW:尽管该参考文献中没有提到下面这个更简化的语法,但我轶事发现[至少在Draols中]这是有效的(至少对于,在):6.2.0Map<String, Boolean>ObjectUnderSpecification

rule "you rule name"
when
  ObjectUnderSpecification(mapKey == true)
then
  // RHS code
end

我已经测试了它的工作原理。显然,密钥所在的地图的名称甚至不需要引用...我想只要里面的一些地图有钥匙,那么这就是进一步评估的东西。如果您找到一个反映我上面轶事中发现的参考资料,请在任何参考资料中发表评论或编辑。ObjectUnderSpecification

(我不知道这是否可以与嵌套地图类似)。

我想这种类型的语法也可以与这里的问题一起使用,如下所示(但我还没有测试过这个):Map<String, Float>

when
  $map: Map(BMI < 18)
then