0

我正在使用 Drools 7 将字符串传递给 drools 规则:

public static void main(String[] args) {
    log("Starting");

    KieContainer kc = KieServices.Factory.get().getKieClasspathContainer();
    KieSession ksession = kc.newKieSession("RulesKS");
    ksession.insert( "asdf" );
    ksession.fireAllRules();

    ksession.dispose();
    log("Done");
}

请注意,我正在设置一个“事实”,其值为asdf运行规则。这是我的规则文件:

package drools7

function boolean ifContains(String target, String searchFor) {
    return target.indexOf(searchFor) != -1;
}

rule "First Rule"
    salience 90
    when
        eval(ifContains("target", "et"))
    then
        System.out.println("Does contain");
end

现在,当我运行我的主要方法时,我看到:

包含

打印到标准输出,但是我将如何在 drools 规则文件中检查我插入的实际事实?

这是如何运作的?我想看看事实是否包含“et”,而不是标量值?

4

1 回答 1

1

我建议你先阅读Drools 官方文档和/或一些 Drools 书籍。

对于您的特定情况,您需要做的是在规则的左侧编写一个与您的事实相匹配的模式:

rule "First Rule"
  salience 90
  when
    String(ifContains(this, "et"))
  then
    System.out.println("Does contain");
end

您甚至可以优化您的规则以避免使用不必要的函数定义并使用contains运算符进行调用:

rule "First Rule"
  salience 90
  when
    String(this contains "et")
  then
    System.out.println("Does contain");
end

希望能帮助到你,

于 2018-03-02T14:08:21.580 回答