0

在定义 Drools 规则时,容纳对象图的最佳方式是什么?

假设我有以下具有多对多关系的实体对象图:

User <- Group -> Value

我有以下人为的规则:

rule "hasPurpleValue"
    $u : User()
    $g : Group() from $u.groups
    $v : Value(color == 'Purple') from $g.values
then
    //...
end

我可以将用户插入到 ksession 中,如下所示:

//build user...
User user = new User();
Group group = new Group();
Value value = new Value("Purple");
group.setValue(value);
user.addGroup(group);

ksession.insert(user);

然后更新它们:

ksession.update(ksession.getFactHandle(user), user);

但是,如果我将 Value 对象直接更改为"Orange",则 Value 没有 FactHandle,因为它是以用户为根插入的。是否有更好的方法来定义规则并插入实体,以便我可以独立更改实体,而 Drools 将评估结果?

4

1 回答 1

1

你必须做出自己的选择。正如您在帖子中提到的,您无法更新不是事实的内容。您 insert() 的每个对象都是一个事实,但对于嵌套对象而言并非如此。处理嵌套对象的一种方法是做你刚才所做的:使用from模式。正如您所描述的,这种模式的问题是您始终必须 update() 与您正在修改的真实对象相关的 Fact 对象。如果你能忍受它,那就去吧。处理此问题的另一种方法是将每个对象作为事实插入:用户、组和值。这可能会使您的插入代码更脏,但您将获得灵活性、可读性以及在某种程度上提高规则的性能。所以,这里没有神奇的食谱。您必须使用对您的场景更方便的东西。

希望能帮助到你,

于 2013-02-05T09:18:22.930 回答