问题描述
我已经制定了一条规则,并在会话中插入了一个问题。如果问题是正确的,它将插入一个标志;如果问题不是正确的,则将删除问题并且不更新标志。在会话中插入问题之前,我需要检查标志的值。我尝试了几种方法来做到这一点,但没有让流口水的事情做到这一点。这是我的规则:
插入问题规则
rule "Threat: ATTACK_OTHER_USERS; insert question"
agenda-group "evaluate attack category"
dialect "mvel"
when
Threat(this == Threat.ATTACK_OTHER_USERS)
// $FLAGS(this == FLAGS.PUBLIC_READABLE) // i need the check here,the existing doesn't work
then
insertLogical(QRiskFactor.QRF1_S4_PUBLIC_READABLE);
end
问题是正确的
rule "Threat: Public Readable QRF_1.4 [true]"
agenda-group "evaluate attack category"
dialect "mvel"
when
$q1: QRiskFactor(this == QRiskFactor.QRF1_S4_PUBLIC_READABLE)
Application($rf : riskFactors[QRiskFactor.QRF1_S4_PUBLIC_READABLE.value],$rf!.factor == "true")
then
delete($q1);
insert(FLAGS.PUBLIC_READABLE);
end
问题是错误的
rule "Threat: Public Readable -- QRF_1.4 [not true]"
agenda-group "evaluate attack category"
dialect "mvel"
when
$q1: QRiskFactor(this == QRiskFactor.QRF1_S4_PUBLIC_READABLE)
Application($rf : riskFactors[QRiskFactor.QRF1_S4_PUBLIC_READABLE.value],$rf!.factor != "true")
then
delete($q1);
end
解决方法
您需要检查工作内存中是否存在特定标志。您的规则中注释掉的语法几乎是正确的,只是您似乎有多余的$
。
由于您尚未分享FLAGS
是什么,因此很难专门回答您的问题。根据您如何制定insert
语句,我将假定它是一个像这样的枚举:
public enum FLAGS {
PUBLIC_READABLE,// possibly other values
}
因此,如果您要验证已将FLAGS.PUBLIC_READABLE
插入到工作内存中,则您的规则将包括:
when
exists(FLAGS( this == FLAGS.PUBLIC_READABLE ))
我使用exists
是因为您没有表示您需要对标志做任何事情,所以我只是检查它的存在。
请注意,insert
不会重新执行先前评估的规则。如果您需要重新评估所有工作内存,则应改用update
。
基于注释,这是实现简单的“测验”应用程序的方式。用户提出问题的答案;如果用户回答正确,则会向他们显示下一个问题。如果用户回答不正确,那么这对他们来说就是“游戏结束”,并且会为他们提供正确答案,以解决他们的错误回答。
我正在使用一些非常简单的模型:
class Question {
private int id;
private String questionText;
private String correctAnswer;
// getters and setters
}
class QuizUtils {
public static Question showNextQuestion();
public static void doGameOver(Question questionMissed);
}
用户的答案是直接在工作存储器中输入的字符串。
rule "User got the question right"
when
// the user's answer
$userAnswer: String()
// the current question
Question( correctAnswer == $userAnswer )
then
QuizUtils.showNextQuestion();
end
rule "User got the question wrong"
when
$userAnswer: String
$question: Question (correctAnswer != $userAnswer )
then
QuizUtils.doGameOver($question);
end