Обновление графа объекта Drools JPA

Как лучше всего разместить графы объектов при определении правил Drools?

Скажем, у меня есть следующий граф объектов Entity с отношением «многие ко многим»:

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 оценивал результат?


person John Ericksen    schedule 05.02.2013    source источник


Ответы (1)


Вы должны сделать свой собственный выбор. Как вы упомянули в своем посте, вы не можете обновить то, что не является фактом. Каждый объект, который вы вставляете(), является фактом, но это не так для вложенных объектов. Один из способов работы с вложенными объектами — сделать то, что вы только что сделали: использовать шаблон from. Проблема этого шаблона, как вы описали, заключается в том, что вам всегда нужно обновлять () объект Fact, связанный с реальным объектом, который вы изменяете. Если вы можете с этим жить, то дерзайте. Другой способ справиться с этим — вставить каждый объект как факт: пользователь, группу и значение. Это может сделать ваш код вставки более грязным, но вы выиграете в гибкости, удобочитаемости и, в некотором смысле, производительности ваших правил. Так что волшебного рецепта здесь нет. Вы должны использовать то, что более удобно для вашего сценария.

Надеюсь, поможет,

person Esteban Aliverti    schedule 05.02.2013
comment
Есть ли способ определить правило from по-другому, чтобы я мог независимо вставлять пользователя, группу и значение, а слюни создавали ассоциации? - person John Ericksen; 05.02.2013
comment
Связь между сущностями должна каким-то образом существовать: по ссылке (объект) или по значению (id) в вашем коде. Затем вы можете вставить каждого пользователя, группу и значение как отдельные факты и написать свои правила, не используя «от», но записывая ограничения, касающиеся отношений ваших фактов: когда $u: User() $g: Group(this memberof $ u.groups) $v: значение(этот элемент из $g.values) конец - person Esteban Aliverti; 06.02.2013
comment
Отступ в моем предыдущем сообщении - беспорядок. Здесь то же правило в более удобном формате: pastebin.com/7FPNi0XG. - person Esteban Aliverti; 06.02.2013
comment
Я начинаю думать, что мне следует установить правила, чтобы следовать стороне владения отношения, например, если бы группа владела ссылкой на пользователя и значение: pastebin.com/gqwJk88V . Это на правильном пути? - person John Ericksen; 06.02.2013
comment
«==» обычно более эффективен, чем «memberof», поэтому, если отношения в вашей модели двунаправленные, я бы продолжил ваш подход. - person Esteban Aliverti; 07.02.2013