2014-02-11 2 views
0

Я хочу использовать Drools для управления некоторыми вопросами в форме. В зависимости от ответа на вопрос, оценка вопроса обновляется со значением. Затем я хочу получить минимальное значение всех вопросов, заданных в категории.Как получить минимум обновленного значения в Drools?

Один пример:

Category "Replicant or not?": 
You’re in a desert walking along in the sand when all of the sudden you look down, and you see a tortoise, crawling toward you. You reach down, you flip the tortoise over on its back. Why is that? 
1. it was an error. (5 points). 
2. It is the funniest think to do at a dessert. (3 points). 
3. You want to kill the tortoise in the most painful way (1 point). 
//More other questions. 

В конце теста, минимальное значение для каждой категории будет использоваться один.

Тогда я определил некоторые Drools правила, чтобы определить счет для каждого из них (в таблице, на я ставлю правила перевода):

rule "Question_1" 
    when 
      $qs: Questions(checked == false); 
      $q: Question(category == 'cat1', question == "q1", answer == "a") from $qs.getQuestions(); 
    then 
      $q.setValue(5); 
      $qs.setChecked(true); 
      update($qs); 
end 

checked значение используется, чтобы избежать повторного использования правила при обновлении , category, question, answer используются для классификации вопроса.

И потом, мое правило для расчета минимального является:

rule "Min value" 
when 
    $qs: Questions(checked == true); 
    not q:Question($v: value; value < $v) from $qs.getQuestions(); 
then 
    $qs.setMinValue($v); 
    System.out.println("The smallest value is: "+ $v); 
end 

Ошибка полученный:

$v cannot be resolved to a variable 

Тогда возникает вопрос: Как я могу получить минимальное значение величины установленное предыдущим правилом?

ответ

1

дублирование «от» можно избежать, используя CE накопления которая составляет около На 25% быстрее.

rule "getmin" 
when 
    Questions($qs: questions) 
    accumulate(Question($v: value) from $qs; $min: min($v)) 
then 
    System.out.println("minimum is " + $min); 
end 
+0

Ответы @EstebanAliverti отлично работают. Но ваше решение также делает это! – JorgeHortelano

+0

Я согласен с этим ответом, потому что это быстрее, но решение EstebanAliverti также хорошо. – JorgeHortelano

1

Вы пытаетесь получить $ v от факта, которого не существует: not q:Question($v: value; value < $v) from $qs.getQuestions(); Каково ожидаемое значение $ v, нет вопроса, соответствующего этому шаблону !?

Что seccond картина в основном говорят, является: «нет Вопроса от Questions.getQuestions(), которая имеет значение ($ v), и что это значение меньше, чем такое же значение»

Что вы имеете для этого нужно связать $ v с положительным рисунком. Что-то вроде этого:

rule "Min value" 
when 
    $qs: Questions(checked == true); 
    Question($v: value) from $qs.getQuestions() 
    not Question(value < $v) from $qs.getQuestions(); 
then 
    $qs.setMinValue($v); 
    System.out.println("The smallest value is: "+ $v); 
end 

Надеется, что это помогает,

--- Редакция: добавлена ​​недостающего вопрос положительного образец

+0

Да, но значение не является свойством 'Вопросы' (то есть объект со списком вопросов). Это свойство «Вопрос». Как я могу привязать его к «Вопросу»? – JorgeHortelano

+0

Извините, моя ошибка. Я отредактировал свой ответ. –

+0

Спасибо за решение! – JorgeHortelano

Смежные вопросы