Drools查询“通配符”

时间:2013-04-08 10:07:50

标签: java drools

是否可以将事实插入作为通配符的Drools工作内存(例如查询的约束)?

例如,假设我有以下规则:

rule "meal_exceptions_1"
    agenda-group "MEAL"
    salience 100
    when
        Meal(id = "Breakfast")
        Person(name == "Sally")
    then
        insert(new Food("Jelly"));
        drools.setFocus("OTHERGRP");
end 

rule "meal_breakfast"
    agenda-group "MEAL"
    when
        Meal(id == "Breakfast")
    then
        insert(new Food("Cornflakes"));
        drools.setFocus("OTHERGRP");
end 

rule "meal_dinner"
    agenda-group "MEAL"
    when
        Meal(id == "Dinner")
    then
        insert(new Food("Fish Fingers"));
        drools.setFocus("OTHERGRP");
end

我想回答一个问题:“早餐可以订购的所有食物是什么”(也许我订购了厨房用品)。

我可以轻松插入一个事实,new Meal("Breakfast")将结果限制为适用于早餐的结果。但是,我的应用程序不知道哪些人可能要求例外,甚至不知道整个人群是什么。我想在Person("*")的行中添加另一个事实,这样就符合第一条规则,即使我不知道(或关心!)特别是Sally请求了不同的食物。< / p>

所需的输出是一个包含玉米片和果冻的工作记忆。是否有可能在没有潜在例外的具体知识的情况下发出这样的查询?

1 个答案:

答案 0 :(得分:1)

我不知道任何这样的通配符,我有点怀疑它甚至可能。 我不会问你为什么要在Drools规则中插入事实,你可能有一些很好的理由,否则回到绘图板。

由于这些都是例外,处理这种情况的一种方法是在会话中注册所有异常事实。在这个基本情况下,你只需要注册Person(“Sally”),你就会得到果冻和玉米片的清单。

作为替代方案,您可以添加一个标记,例如Person.wildcard并将您的LHS更改为Person(name == "Sally" || wildcard),但这是一个交易,我怀疑您愿意做,因为您自己注册事实规则。