流口水规则无需评估即可关联两个事实

drools rule to relate two facts without eval

所以我对流口水还是比较陌生。我知道如何使用 eval 来比较事实,但我的印象是我应该能够在没有 eval 语句的情况下编写规则。我希望得到一些帮助,了解在以下情况下我将如何做?

我有一个事实,正在为给定用户的电子邮件地址请求主管:

declare SupervisorRequested
    email : String
end

以及从用户到他们的主管的映射(可能——有些用户没有主管)

// Map<String, User>
knowledgeResources.add(supervisors);

所以我写的规则是

rule "Supervisor Inclusion Requested"
    when
        request : SupervisorRequested()
        supervisors : Map()
        eval(supervisors.get(request.email) != null)
    then
        ...
end

所以,问题是,如果不使用 eval,我怎么能写这个呢?

以下规则将针对地图(假设在工作内存中)包含映射到电子邮件的用户的所有实例触发,并且如果 $supervisors.get($email) returns 为空则不会触发。在 MVEL 中使用 Drools 的最大便利之一是我们应该很少需要进行空检查。

rule "Supervisor Inclusion Requested"
    when
        $request : SupervisorRequested($email: email)
        $supervisors: Map()
        $supervisorWithEmail : User() from $supervisors.get($email)
    then
        ...
end

希望对你有帮助,干杯。

尝试使用以下规则进行所需的条件检查:

rule "Supervisor Inclusion Requested"
when
    request : SupervisorRequested()
    map : HashMap(this.get(request.getEmail())  != null)
then
    // .............
end

您实际上可以使用 this 语法,因为它是 get(...) 的别名。例如:Map( $value: this["foo"]) 在功能上与 $value = map.get("foo").

相同

牢记这一点,您可以像这样编写规则:

rule "Supervisor Inclusion Requested"
when
  SupervisorRequested( $email: email ) // gets the email 
  Map( this[$email] != null ) // checks that the map contains the email
then
 // omitted
end