流口水规则无需评估即可关联两个事实
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
所以我对流口水还是比较陌生。我知道如何使用 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