基于drools中的两个对象添加规则条件
现在我想在drl中编写一个类似于以下内容的条件:基于drools中的两个对象添加规则条件,drools,rule-engine,Drools,Rule Engine,现在我想在drl中编写一个类似于以下内容的条件: > { "batch-execution":{ > "lookup":"defaultKieSession", > "commands":[ > { > "insert":{ > "out-identifier":"FieldData1", > "object":{ >
> { "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部分)的部分,这篇文章写得很好,包含了很多你可以适应或扩展的例子。