基于drools中的两个对象添加规则条件

基于drools中的两个对象添加规则条件,drools,rule-engine,Drools,Rule Engine,现在我想在drl中编写一个类似于以下内容的条件: > { "batch-execution":{ > "lookup":"defaultKieSession", > "commands":[ > { > "insert":{ > "out-identifier":"FieldData1", > "object":{ >

现在我想在drl中编写一个类似于以下内容的条件:

> { "batch-execution":{
>     "lookup":"defaultKieSession",
>     "commands":[
>         {
>             "insert":{
>                 "out-identifier":"FieldData1",
>                 "object":{
>                     "FieldData":{
>                         "name":"abc",
>                         "value":"111"
>                     }
>                 }
>             }
>         },
>         {
>             "insert":{
>                 "out-identifier":"FieldData2",
>                 "object":{
>                     "FieldData":{
>                          "name":"xyz",
>                         "value":"222"
>                     }
>                 }
>             }
>         },
>         {
>             "fire-all-rules":{
> 
>             }
>         }
>     ] } }

有人能帮助我们在drools中如何做到这一点吗?

drools中的规则触发仅在某些事件发生时发生。阅读有关会话和规则执行的信息

来讨论你写上述规则的问题。我不知道你想如何执行这条规则。根据我的理解,如果您想分别编写一条规则来检查xyz和abc的
name
,那么您可以编写如下规则:

rule "testrule"
when
fieldData(name == "abc" , value == "111") && fieldData(name == "xyz",value = "222")
then
System.out.println("Condition executed")
如果要合并规则,则可以将其编写为:

rule "testrule1"
when
  fieldData(name == "abc" , value == "111")
then 
    System.out.println("Condition executed 1")
end

rule "testrule2"
when
  fieldData(name == "xyz" , value == "222")
then 
    System.out.println("Condition executed2")
end
注意:如果要处理多个事件的发生,则不能定义上述规则。如果您想处理多个事件,可以在drools中阅读。添加有关用例的更多信息以获得更好的答案。

当然可以!您的“示例”规则几乎是完美的

drool的工作方式是,它评估工作记忆中所有对象的条件,只有当所有条件都满足时,它才会触发该规则

因此,您可以编写如下规则:

rule "testrule"
when
  fieldData(name == "abc" ||  name == "xyz" && value == "111" || value == "222")
then
    System.out.println("Condition executed")
end
rule "Test Rule"
when
  exists( FieldData( name == "abc", value == "111") )
  exists( FieldData( name == "xyz", value == "222") )
then
  System.out.println("Condition Executed")
end
如果工作内存中存在名称为“abc”且值为“111”的对象,工作内存中也存在名称为“xyz”且值为“222”的对象,则会触发此规则

在上面的示例中,我使用了“exists”谓词,因为我们实际上不会对这些值做任何操作,我们只是想确认内存中是否有这样一个FieldData对象符合所需的条件


注意,这假设您已将FieldData对象作为独立对象直接输入工作内存。(例如,您启动了规则并向其传递了一个FieldData列表。)如果您使用的是更大的结构,则必须提取FieldData对象,然后像我在上一个示例中那样执行存在检查

例如,假设您有一组这样的类(模仿您的示例JSON;为简洁起见省略了getter和setter):

类字段数据{
字符串名;
字符串值;
}
类命令{
未识别的字符串;
现场数据对象;
}
类批处理执行{
字符串操作;//例如“插入”
字符串查找;
列出命令;
}
如果将
BatchExecution
传递到规则中,则需要先从命令中提取字段数据,然后才能检查是否存在符合所需条件的两个字段数据。因此,您的规则看起来更像这样:

rule "testrule"
when
  fieldData(name == "abc" ||  name == "xyz" && value == "111" || value == "222")
then
    System.out.println("Condition executed")
end
rule "Test Rule"
when
  exists( FieldData( name == "abc", value == "111") )
  exists( FieldData( name == "xyz", value == "222") )
then
  System.out.println("Condition Executed")
end
基本上,我们要做的是从实际插入工作内存的对象向下钻取,直到我们可以找到我们需要处理的对象,在本例中是FieldData。我使用
accumulate
aggregate将所有字段数据拉到一个列表中,然后检查我们在这个特定规则中寻找的两个字段数据是否存在

对于更多的信息,你应该考虑阅读,特别是“规则语言引用”(第4部分)的部分,这篇文章写得很好,包含了很多你可以适应或扩展的例子。