Drools:涉及从字符串到对象的映射的规则
Drools: Rules involving a Map from String to Object
我需要帮助编写 Drools 规则。我有两个 类 名为 Context 和 CreditReport。
上下文在触发规则之前作为事实插入到知识会话中。
我需要编写一个规则,当信用评分超过 800 时,在控制台上打印 'Excellent'。
理想情况下,我会将 CreditReport 直接插入到会话中,但遗憾的是我没有该选项。
我写的规则看起来不太好:
- then 部分有一个 if 语句
- 我正在将对象类型转换为 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
我需要帮助编写 Drools 规则。我有两个 类 名为 Context 和 CreditReport。
上下文在触发规则之前作为事实插入到知识会话中。
我需要编写一个规则,当信用评分超过 800 时,在控制台上打印 'Excellent'。
理想情况下,我会将 CreditReport 直接插入到会话中,但遗憾的是我没有该选项。
我写的规则看起来不太好:
- then 部分有一个 if 语句
- 我正在将对象类型转换为 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