You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drools LHS中获取已定义变量并添加约束?

如何通过Drools API复用并修改已定义的$stu变量约束

要实现给已定义的$stu变量添加额外约束,核心是在构建规则时保存Student对应的PatternDescr实例,后续直接对该实例添加新约束即可。具体操作如下:

方案一:拆分链式调用,保存Pattern实例

把原来的链式调用拆解开,单独保存Student模式的实例,后续直接调用其constraint方法添加新条件:

// 先构建到LHS的and节点,保存该节点实例
AndDescr andDescr = DescrFactory.newPackage()
       .name("org.drools.example")
       .newRule().name("Xyz")
           .attribute("ruleflow-group","bla")
       .lhs()
           .and();

// 创建Student模式并保存其实例
PatternDescr studentPattern = andDescr.pattern("Student")
       .id("$stu", false)
       .constraint("name==miko")
       .constraint("age > 6")
       .end();

// 给保存的Student模式添加新约束
studentPattern.constraint("grade != 2");

// 继续完成剩余规则的构建
andDescr.not().pattern("Bar").constraint("a+b==c").end().end();
PackageDescr pkg = andDescr.end().end().end();

方案二:链式调用中通过also方法保存实例

如果不想拆分链式调用,可以通过also方法在构建过程中直接捕获PatternDescr实例:

PackageDescr pkg;
PatternDescr studentPattern = null;

pkg = DescrFactory.newPackage()
       .name("org.drools.example")
       .newRule().name("Xyz")
           .attribute("ruleflow-group","bla")
       .lhs()
           .and()
               .pattern("Student").id( "$stu", false ).constraint("name==miko").constraint("age > 6")
                   // 捕获当前Pattern实例
                   .also(pattern -> studentPattern = pattern)
                   .end()
               .not().pattern("Bar").constraint("a+b==c").end().end()
           .end()
       .end();

// 后续添加新约束
if (studentPattern != null) {
    studentPattern.constraint("grade != 2");
}

最终生成的DRL效果

经过上述修改后,生成的DRL会自动合并所有约束:

$stu: Student(name == miko, age > 6, grade != 2)
not Bar(a + b == c)

内容的提问来源于stack exchange,提问作者Miko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:22:22