Java 在Drools中传递多个对象不起作用
我创建了一个状态完整的知识会话,用于在会话中插入多个对象Java 在Drools中传递多个对象不起作用,java,drools,rule-engine,Java,Drools,Rule Engine,我创建了一个状态完整的知识会话,用于在会话中插入多个对象 StatefulKnowledgeSession ksession = initializeDrools(runtimeDrlFile.getFilePath()); private StatefulKnowledgeSession initializeDrools(String filePath) throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFa
StatefulKnowledgeSession ksession = initializeDrools(runtimeDrlFile.getFilePath());
private StatefulKnowledgeSession initializeDrools(String filePath) throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newFileResource("E:\\drools\\" + filePath), ResourceType.DRL);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase.newStatefulKnowledgeSession();
}
假设我有两张地图,比如
Map<String, Object> map = new HashMap<String, Object>(); // Assume somthing is stored in it
Map<String, Object> maps = new HashMap<String, Object>(); // ""
这是我的口水档案
import java.util.Map;
rule "Category Level"
when
$map: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
then
$map.put("Discount", String.valueOf("10.00"));
System.out.println($map);
System.out.println($maps);
end
它显示我是
Caused by: java.lang.IllegalArgumentException: Could not parse knowledge.
如果我删除System.out.println($maps)代码>,它工作正常。如果我在drl文件中将所有出现的$map
替换为$maps
,它也可以正常工作,但现在我无法访问$map
,反之亦然
我将多个对象传递到drools的逻辑有什么问题吗
更新:
清除非法参数异常后
import java.util.Map;
rule "Category Level"
when
$maps: Map()
$map: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
then
$map.put("Discount", String.valueOf("10.00"));
System.out.println($map);
System.out.println($maps);
end
现在的问题是,sysout
正在打印$map
的值。为什么将$maps
值替换为$map
?您没有在任何地方定义$maps
。您需要声明它并为其赋值
你想要这样的东西:
$map: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
$maps: Map()
像这样的图案
$mx: Map()
能够绑定作为事实插入的任何映射。所以,如果你有两种模式
$mx: Map()
$my: Map()
单个映射将绑定为$mx和$my。如果你有两张地图,a和b,它们将以四种方式绑定:a-a,a-b,b-a,b-b
向图案添加约束,例如
$mx: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
限制可能的匹配和绑定,但添加另一个模式:
$mx: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
$my: Map()
仍将生成多个匹配,例如,当两个映射作为事实,其中一个映射与第一个模式匹配时,仍将得到a-a,a-b
众所周知,java.util.Map和其他“匿名”容器类(映射和所有集合)的匹配非常棘手。如果地图代表某个“真实世界”实体,它应该有一个提供唯一标识的条目。在所有模式中都使用此选项
最好将JavaBean用作事实,某些字段提供标识。您能解释一下什么是…什么东西…
?因为我试过像$maps:Map
,但不起作用。。更新:$maps:Map()
正在工作。。谢谢你!Drools会让你为这个东西发疯奇怪的是,当我放入System.out.println($map)时,我在java的$maps
中存储并传递到Drools中的任何东西;System.out.println($maps)
,两者都在打印存储在$map
中的值。知道为什么会发生这种情况吗?它们被设置为相同的值,您需要在Map()中添加一些条件来区分它。一个声明一次只能表示一个事实,因此$Map只是一个事实。也没有$maps的声明,所以当你试图打印它时,你必须打印一些不存在的东西。@ConMan,是的。。现在我明白了。@ConMan,我已经更正了声明部分,但奇怪的是,当我放入System.out.println($map)时,我在java中存储在$maps
中并传递到drools中的任何内容;System.out.println($maps)
,两者都在打印存储在$map
中的值。知道为什么会这样吗?
$mx: Map( this["CategoryCode"] == "10" && this["CategoryAmount"] >= 1000 )
$my: Map()