在for循环中从Java运行r.execute()

时间:2015-03-26 19:33:04

标签: java jess

我在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))");
    }
}

答案是JESS中有两个插槽的反映。我正在用Java读取文本文件并将值插入deftemplate的插槽中。

谢谢, 阿里

1 个答案:

答案 0 :(得分:0)

如果answer是对插槽identtext进行反击,则以下代码段看起来像是构建了一个事实:

(answer(ident headers.get(i)(text patientData.get(j).get(i))
  • 一个简单的事实并不代表可以通过Rete.executeCommand执行的Jess命令。
  • 您不应该使用弃用的方法executeCommand;使用eval
  • 你的括号没有正确平衡,6个开口括号与4个结束括号。
  • 假设您的Java应用程序中的头文件是List<String>,您不能简单地在Jess上抛出Java方法调用,而Jess一开始并不理解Java语法,并且(可能)没有#J?至少知道pojo header
  • pojo patientData也是如此。
  • 虽然您可以将对象从Java程序传递到Jess引擎,但对于ij之类的简单变量来说,这是绝对不可能的。

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

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

可能有成功的机会并且确实会将新事实插入工作记忆中。