-1

我在 JESS 中编写了一个代码。我现在正在从 Java 运行代码。我遇到了这个问题,我想在 for 循环中使用 engine.execute("") 命令。我的示例代码是:

for (int i = 0; i < 10; i++){
    for (int j = 0; j < 10; j++){
r.executeCommand("(answer(ident headers.get(i)(text patientData.get(j).get(i))");
    }
}

其中 answer 是 JESS 中带有两个插槽的 deftemplate。我正在阅读 Java 中的文本文件并将值插入到 deftemplate 的插槽中。

谢谢,阿里

4

1 回答 1

0

Ifanswer是一个带有插槽的 deftemplateidenttext,下面的代码片段看起来像是一个事实的构造:

(answer(ident headers.get(i)(text patientData.get(j).get(i))
  • 一个赤裸裸的事实并不代表可以通过Rete.executeCommand.
  • 您不应该使用已弃用的方法executeCommand;使用eval.
  • 你的括号没有正确平衡,6个左括号对4个右括号。
  • 假设标头List<String>在您的 Java 应用程序中,您不能简单地向 Jess 抛出 Java 方法调用,它首先不理解 Java 语法并且(可能)根本不知道 pojo header
  • pojo 也是如此patientData
  • 虽然您可以将Java 程序中的对象i传递给 Jess 引擎,但这对于像和之类的简单变量是绝对不可能的j

考虑到所有这些(其中大部分很容易从优秀的 Jess 手册中学习),使用

r.eval( "(assert (answer (ident \"" +
        headers.get(i) +
        "\")(text \"" +
        patientData.get(j).get(i) +
        "\")))" );

可能有成功的机会,并且确实在工作记忆中插入了一个新的事实。

于 2015-03-27T06:21:02.680 回答