我需要帮助编写Drools规则。我有两个名为Context和CreditReport的类。
在触发规则之前,将Context作为事实插入到知识会话中。
我需要写一个打印出来的规则' Excellent'当信用评分超过800时,在控制台上。
理想情况下,我会将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
答案 0 :(得分:1)
是什么让您插入包含单个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。 - 我怀疑你所表现的更复杂,但是#34;我没有这个选择&#34;无论如何都是代码味道。
修改单个规则有多种原因可供打印&#34;优秀&#34;可以写成如下所示,虽然这不比两个规则好得多,考虑到你可以将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