【问题标题】:Is there any API in drools to create the drl files dynamically by just passing values?drools 中是否有任何 API 可以通过传递值来动态创建 drl 文件?
【发布时间】:2015-02-15 19:57:14
【问题描述】:

我知道如何使用所有方法在 KIE 工作台中创建 DRL 文件。但是我的问题是没有使用 KIE 工作台,我们可以使用我们所需的值创建 .drl 文件。如果有任何可能,请建议我。同样的方式建议我任何 API 都与此有关。提前致谢。

【问题讨论】:

  • 他们实际上并没有创建 DRL,但您应该阅读有关决策表和模板的文档。
  • 嘿@Steve,感谢您的快速回复。能否请您提供文档链接。谢谢。
  • 这还不足以以任何合理的精确度回答问题。

标签: java drools drools-guvnor kie


【解决方案1】:

即使我使用了@apandey846 建议的相同实现。我只想补充一点:如果你想导入所需的类,你可以这样做:

               PackageDescr pkg = DescrFactory.newPackage()                        
               .newImport("classname").target().end()
               .name("org.drools.example")
               .newRule().name("Xyz")
                   .attribute("ruleflow-grou","bla")
               .lhs()
                   .and()
                       .pattern("Foo").id( "$foo", false ).constraint("bar==baz").constraint("x>y").end()
                       .not().pattern("Bar").constraint("a+b==c").end().end()
                   .end()
               .end()
               .rhs( "System.out.println();" ).end()
               .getDescr();

要在 LHS 中添加多个条件,您可以:

               pattern("eval").constraint("condition1").end().
               pattern("eval").constraint("condition2").end().
               pattern("eval").constraint("condition3").end().

希望对您有所帮助.. :)

【讨论】:

    【解决方案2】:

    您可以使用Drools Fluent API。试试下面的示例代码:

    package com.sample;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    
    import org.drools.lang.DrlDumper;
    import org.drools.lang.api.DescrFactory;
    import org.drools.lang.descr.PackageDescr;
    
    @SuppressWarnings("restriction")
    public class Drl_Creator {
        public static void main(String str[]){
            PackageDescr pkg = DescrFactory.newPackage()
                       .name("org.drools.example")
                       .newRule().name("Xyz")
                           .attribute("ruleflow-grou","bla")
                       .lhs()
                           .and()
                               .pattern("Foo").id( "$foo", false ).constraint("bar==baz").constraint("x>y").end()
                               .not().pattern("Bar").constraint("a+b==c").end().end()
                           .end()
                       .end()
                       .rhs( "System.out.println();" ).end()
                       .getDescr();
            DrlDumper dumper=new DrlDumper();
            String drl=dumper.dump(pkg);
            System.out.print(drl);
            try{
                // create new file
                File file = new File("src/main/rules/test.drl");
                file.createNewFile();
                FileWriter fw = new FileWriter(file.getAbsoluteFile());
                BufferedWriter bw = new BufferedWriter(fw);
                bw.write(drl);
                // close connection
                bw.close();
                System.out.println("File Created Successfully");
             }catch(Exception e){
                 System.out.println(e);
             }
        }
    }
    

    【讨论】:

    • 如果我需要在包名后添加import class或package语句,我该如何添加?谢谢
    【解决方案3】:

    Decesion 表对我有用,或者您可以尝试使用新的 Drools 工作台。

    我使用了 DrlDescr 转储方法,但它没有更新 drl 文件,有人知道为什么吗?

    代码:- pkg1.addRule(规则); System.out.println(dDump.dump(pkg1));

    【讨论】:

      【解决方案4】:

      另一种选择是使用“descr”API,从工厂开始:

      org.drools.compiler.lang.api.DescrFactory
      

      这些 API 构建了 Drools AST,可以直接传递给编译器, 绕过解析器。 AST 也可用于重新创建 DRL,使用 助手类org.drools.compiler.lang.DrlDumper

      【讨论】:

        【解决方案5】:

        我以两种不同的方式解释您的问题。

        1。是否可以在不使用 KIE 工作台的情况下为 Drools 编写规则?

        是的,它应该支持导入规则,所以您需要做的就是打开一个文本编辑器并开始输入。这些规则使用相当简单的语法以文本形式编写,您可以在大约 1-2 小时的阅读中弄清楚。我不知道您的环境是什么样的,但应该有一种机制来解析和导入新规则。您编写的所有规则都将从如下所示的文本编辑器开始:

        rule "<name>"
            <attribute>
        when
            <conditional element>
        then
            <action>
        end
        

        您将添加到条件和操作。当然,你必须知道你可以创造什么样的条件,这些条件受限于你的环境,同样适用于行动。

        2。是否可以通过某种 API 创建规则并以编程方式使用它们?

        是的,我一直在使用 Java API 进行处理。我们使用两种类型的规则,静态的和动态的。静态的具有预先设定的条件,并且被编写为一遍又一遍地执行相同的比较(LHS),并在每次满足条件时执行相同的操作(RHS)。动态对象是根据用户在创建时指定的一组极简对象类型和比较 (LHS) 动态创建的。动作 (RHS) 是预先设定好的,但根据整体规则使用的需要选择使用。整个规则被创建为文本,然后传递给 Drools 解析器,然后被添加到要评估的规则列表中。

        希望这会有所帮助。

        【讨论】:

        • 您能否添加有关选项 2 的更多详细信息?就像使用哪个库来“将规则创建为文本,然后传递给 Drools 解析器,然后再添加到要评估的规则列表中。”
        • 这些行满足您的要求。抱歉无法为我格式化。
          KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder( ); kb.add(ResourceFactory.newByteArrayResource(ruleset.getBytes()), ResourceType.DRL);
        【解决方案6】:

        标准工具不生成 DRL 文件。相反,他们鼓励您拥有在运行时应用于数据的模板。

        您应该查看有关决策表(特别结构化的电子表格)的文档:

        http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/#d0e4221

        ...和规则模板:

        http://docs.jboss.org/drools/release/6.0.1.Final/drools-docs/html_single/#d0e4969

        【讨论】:

        • 感谢@Steve 的回答。但我正在寻找的要求与这种情况不同。你给了我正确的东西来通过决策表实施规则。可能是我的要求不够好。再次感谢。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        相关资源
        最近更新 更多