当前位置: 首页 > 知识库问答 >
问题:

DRools:如何在事实中的任意嵌套列表上使用

戚繁
2023-03-14

假设我们在JavaEE应用程序中有这些类,它们也是Hibernate实体:

public class A {
    private String code;

    private List<B> tests;
}

public class B {
    private String code;

    private List<C> steps;
}

public class C {
    private String code;

    private List<D> subSteps;
} 

在过去几年中,创建了一些Swing窗口,让配置器用户创建ad deploy DRools软件包规则,以自定义客户所需的工作流。这些窗口以某种方式将Swing组件转换为Drool Mvel文本,以避免配置程序用户编写原始代码。然后将这些规则保存并部署到BLOB字段中的DB表中,并在需要时执行。问题是,现在我们需要实现一个新的事实层次结构,对其执行断言以触发规则。使用示例代码中的a类事实,此代码是从DRools窗口生成的:

rule "RULE_TRY" 
 dialect "mvel"
 salience 10
 enabled true
 no-loop false
 when
    $a : A(  )
    $b : B( code == "testCode" ) from $a.tests
    $c : C( code== "stepCode" ) from $a.tests.steps

 then
end

很明显,这个规则和事实反映了我们的DB结构,其中“code”是相应的相对表中的PK或FK
但此代码会在编译和部署包时引发DRools错误:

无法为“from”生成表达式:未能编译:1个编译错误:-(1,26)步骤“$a.tests”的严格模式下的非限定类型。步骤“:[规则名称=”Rule\u TRY“]

也许,这是正确的语法:

when
    $a : A(  )
    $b : B( code == "testCode" ) from $a
    $c : C( code== "stepCode" ) from $b

? 因为,考虑到Mvel代码是一种getter/setter,我希望像$a.tests中的这样的语法返回一个列表

目前,我看到DRL语言中的最后一个字符串是通过调用classDrlDumper上的方法dump()创建的。


共有1个答案

淳于星宇
2023-03-14

我认为您需要的语法是:

rule "RULE_TRY" 
dialect "mvel"
salience 10
enabled true
no-loop false
when
  $a : A(  )
  $b : B( code == "testCode" ) from $a.tests
  $c : C( code== "stepCode" ) from $b.steps
then
  //...
end

希望有帮助,

 类似资料:
  • 这篇文章建议添加一些事实类作为嵌套规则的一种方式。http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681 我想知道的是——有没有保证“年龄和性别女性”在“怀孕”之前执行,“怀孕”在“怀孕2”之前执行?据我所知,我的申请中总是这样。但是,它是记录在口水留档的某个地方,还是只是等待倒塌的纸牌屋?

  • 使用JSF 2.0,我需要显示一个表,其中每一行都包含一个打开弹出窗口的链接。我有两种型号:

  • 我使用Apache Spark 2.2.0和Scala。 我以这个问题为指导,在不使用pivot函数的情况下透视数据帧。 我需要在不使用pivot函数的情况下透视数据帧,因为我有非数字数据,而< code>pivot只对数字数据使用聚合函数,如< code>sum 、< code>min 、< code>max。我想在< code>pivot聚合中使用一个非数字列。 这是我的数据: 我希望它按<

  • 问题内容: 我有这个嵌套列表: 现在,我要做的是将列表中的每个元素转换为float。我的解决方案是这样的: 但这可以使用嵌套列表理解来完成吗? 我所做的是: 但是结果是一堆100的总数为2400。 任何解决方案,解释将不胜感激。谢谢! 问题答案: 这是使用嵌套列表理解的方法: 这将为你提供一个列表列表,与你开始时的列表类似,只是使用浮点数而不是字符串。如果你想要一个固定列表,则可以使用。

  • 问题内容: 没有使用foreach循环就可以针对以下问题定义LINQ语句吗? 在写这个问题时,我找到了解决问题的办法。我仍然会发布(并回答)这个问题,因为这个问题对我来说真是个麻烦。而且我在这里没有找到合适的现有问题。 乔,尤文 问题答案: 相信and可以解决这个问题! 第二个变量名称具有误导作用。除其他字母外,它还会返回的一个实例,该实例在原始集合中 不是 唯一的;)

  • 在索引位置1的输入中遇到的字符串的前半部分将被替换为字符“-”使用流我们如何执行操作? 我有上面的列表,我想用我这样做的循环将每个嵌套列表值的第一个位置替换为“-” 样本输出:[[0,-],[6,-],[0,-],[6,gh],[4,ij],[0,ab],[6,cd]] 但是任何人都可以解释如何使用流来实现同样的目标