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

У меня есть граф объектов, из которого я пытаюсь создать объект Fulfillment в Drools. В частности, объекты Fulfillment представляют правило, которое либо выполняется, либо не выполняется. Мой граф объектов выглядит следующим образом:

Users ---> many Requirements --> Event
      `--> many Records      ----^

Записи могут соответствовать требованиям, если они обе указывают на одно и то же событие. Это создает объект Fulfillment в Drools.

Правило редукции для получения выполнения следующее:

rule "fulfils"
when
    $u : User()
    $rec : Record() from $u.records
    $r : Requirement(event contains $rec.event) from $u.requirements
then
    insertLogical( new Fulfillment($u, $rec, $r, true));
    System.out.println("Inserting logical");
end

rule "unfulfils"
when
    $u : User()
    $rec : Record() from $u.records
    $r : Requirement(event not contains $rec.event) from $u.requirements
then
    insertLogical( new Fulfillment($u, $rec, $r, false));
    System.out.println("Inserting logical");
end

query "fulfillment"
    $fulfillment : Fulfillment()
end

Проблема, с которой я сталкиваюсь здесь, заключается в том, что если у пользователя нет записей, для требования не вставлено выполнение. Я считаю, что это потому, что нет Record() для поиска, чтобы удовлетворить мой график.

Есть ли способ использовать записи, не требуя, чтобы существовало больше нуля?

Кроме того, мне нужны два правила, чтобы вставить как истинные, так и ложные исполнения, или есть лучший способ сделать это?

Изменить

Еще одна проблема, с которой я сталкиваюсь при использовании этих правил, заключается в том, что Requirement(event contains $rec.event) не выполняет задачу определения того, удовлетворяют ли какие-либо записи заданному набору событий. Есть ли лучший способ найти, существует ли перекрытие между отдельными событиями многих записей и несколькими событиями отдельных требований?

Еще одно изменение

Вот еще один подход, который я придумал. Вместо того, чтобы вставлять Выполнения, если пара требование/запись не найдена, почему бы просто не вставить Логические Выполнения для всех Требований, у которых нет соответствующего положительного Выполнения:

rule "unfulfils"
when
    $u : User()
    $r : Requirement() from $u.requirements
    not(Fulfillment(user == $u, requirement == $r, fulfilled == true))
then
    insertLogical( new Fulfillment($u, null, $r, false));
    System.out.println("Inserting logical");
end

query "fulfillment"
    $fulfillment : Fulfillment()
end

Это касается вопроса сравнения перекрытия двух коллекций и случая, когда у пользователя нет записей. (Был бы признателен за некоторую проверку по этому поводу).


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


Ответы (1)


Использование двух разных правил для вашей ситуации является распространенным шаблоном. Это делает вашу базу правил более легкой для чтения (и в некотором роде для обслуживания). Что касается вашего вопроса об отсутствии записи (), я думаю, вы могли бы написать что-то вроде этого (если я правильно понял ваш вопрос):

rule "unfulfils because of no Record"
when
    $u : User(records == null || records.empty == true) //A user without records
    $r : Requirement() from $u.requirements // but with Requirements
then
    //You don't have a record to set in your Fulfillment object
    insertLogical( new Fulfillment($u, $rec, null, false));
    System.out.println("Inserting logical");
end
person Esteban Aliverti    schedule 05.02.2013
comment
Это работает, спасибо. Кажется, у меня есть еще одна проблема с моими правилами. Вы можете решить и ее? - person John Ericksen; 05.02.2013