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()