0

是否可以将事实插入作为通配符的 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("*"),以便这将符合第一条规则,即使我不知道(或关心!)具体是莎莉要求不同的食物。

所需的输出是包含玉米片和果冻的工作记忆。是否可以在不了解潜在异常的具体知识的情况下发出这样的查询?

4

1 回答 1

1

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

由于这些都是异常,处理这种情况的一种方法是在会话中注册所有异常事实。在这个基本情况下,您只需要注册 Person("Sally") 并且您将获得 Jelly 和 Cornflakes 的列表。

作为替代方案,您可以添加一个标志,例如Person.wildcard并将您的 LHS 更改为类似的东西Person(name == "Sally" || wildcard),但我怀疑您是否愿意进行交易,因为您自己是在规则范围内注册事实的。

于 2013-04-09T11:47:43.873 回答