Drools:涉及从字符串到对象的映射的规则

Drools: Rules involving a Map from String to Object

我需要帮助编写 Drools 规则。我有两个 类 名为 Context 和 CreditReport。

上下文在触发规则之前作为事实插入到知识会话中。

我需要编写一个规则,当信用评分超过 800 时,在控制台上打印 'Excellent'。

理想情况下,我会将 CreditReport 直接插入到会话中,但遗憾的是我没有该选项。

我写的规则看起来不太好:

  1. then 部分有一个 if 语句
  2. 我正在将对象类型转换为 CreditReport

感谢您的帮助!

// Context.java

public class Context {
    private Map<String, Object> data = Maps.newHashMap();

    public <T> T getData(final String key, final Class<T> clazz) {
        return clazz.cast(data.get(key));
    }

    public void putData(final String key, final Object value) {
        this.data.put(key, value);
    }
}

// CreditReport.java

public class CreditReport {
    private final String name;
    private final int creditScore;

    public String getName() {
        return this.name;
    }

    public int getCreditScore() {
        return this.creditScore;
    }

}

// 主要方法

context.put("creditReport", new CreditReport("John", 810));
session.insert(Arrays.asList(context));
session.fireAllRules();

// 规则

rule "Excellent_Score"
when Context($creditReportObject : getData("creditReport"))
then
    final CreditReport creditReport = (CreditReport) $creditReportObject;
    if (creditReport.getCreditScore() >= 800) {
       System.out.println("Excellent");
    }
end 

是什么让您插入包含单个 Context 对象的 List<Context>? Java 代码应该做

context.put("creditReport", new CreditReport("John", 810));
session.insert( context );
session.fireAllRules();

规则现在可以写成

rule "Excellent_Score"
when 
   Context( $creditReportObject : getData("creditReport") )
   CreditReport( creditScore > 800 ) from $creditReportObject 
then
   System.out.println("Excellent");
end

当然,您可以从 Context 获取并插入 CreditReport。 - 我怀疑你所展示的内容更令人费解,但 "I do not have that option" 无论如何都是一种代码味道。

Edit 出于多个打印原因的单一规则 "excellent" 可以像下面这样写,尽管这并不比两条规则好多少,考虑到您可以将 RHS 包装到方法或 DRL 函数中。

rule "Excellent_Score_2"
when 
   Context( $creditReport : getData("creditReport"),
            $account: getData("account") )
   ( CreditReport( creditScore > 800 ) from $creditReport
     or
     Account( balance >= 5000 ) from $account )
then
   System.out.println("Excellent");
end