在 drools 中插入标志之前检查标志值

Checking flag value before inserting flag in drools

我制定了一条规则,它在会话中插入了一个问题。如果问题为真,则插入一个 FLAG,如果问题不为真,则删除问题并且不更新标志。在会话中插入问题之前,我需要检查标志的值。我已经尝试了几种方法来做到这一点,但没有得到流口水的东西来做到这一点。这是我的规则:
正在插入问题规则

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

您需要检查工作记忆中是否存在您的特定标志。你的规则中注释掉的语法几乎是正确的,除了你似乎有一个无关的 $ present.

由于您没有分享 FLAGS 是什么,因此很难具体回答您的问题。根据您制定 insert 语句的方式,我将假设它是一个像这样的枚举:

public enum FLAGS {
  PUBLIC_READABLE,
  // possibly other values
}

因此,如果您想验证 FLAGS.PUBLIC_READABLE 是否已插入工作内存,您的规则将包括:

when
  exists(FLAGS( this == FLAGS.PUBLIC_READABLE ))

我使用 exists 是因为您没有表明需要对标志执行任何操作,所以我只是检查它是否存在。

请注意 insert 不会 re-execute 之前评估的规则。如果您需要重新评估所有工作内存,则应改用 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