drools规则将两个事实联系起来而不进行评估

drools规则将两个事实联系起来而不进行评估,drools,Drools,所以我还是比较不喜欢流口水。我知道如何使用eval来比较事实,但我的印象是,我应该能够在没有eval声明的情况下编写规则。我希望得到一些帮助,了解在以下情况下我将如何这样做 我有一个事实,一位主管被要求提供一个给定用户的电子邮件地址: declare SupervisorRequested email : String end 以及从用户到其主管的映射(可能——有些用户没有主管) 因此,问题是,我如何在不使用eval的情况下编写此代码?下面的规则将针对映射(假定在工作内存中)包含映射到

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

我有一个事实,一位主管被要求提供一个给定用户的电子邮件地址:

declare SupervisorRequested
    email : String
end
以及从用户到其主管的映射(可能——有些用户没有主管)


因此,问题是,我如何在不使用eval的情况下编写此代码?

下面的规则将针对映射(假定在工作内存中)包含映射到电子邮件的用户的所有实例触发,如果
$supervisors.get($email)
返回null,则不会触发。在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

实际上,您可以使用
这个
语法,因为它是
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
rule "Supervisor Inclusion Requested"
when
    request : SupervisorRequested()
    map : HashMap(this.get(request.getEmail())  != null)
then
    // .............
end
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