10

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

4

6 回答 6

7

您可以使用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);
         }
    }
}
于 2016-10-06T07:19:34.017 回答
6

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

1. 不使用KIE工作台是否可以为Drools编写规则?

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

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

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

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

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

希望这可以帮助。

于 2014-12-23T15:32:08.847 回答
4

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

org.drools.compiler.lang.api.DescrFactory

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

于 2014-12-23T17:30:21.520 回答
2

标准工具不生成 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

于 2014-12-17T10:29:12.330 回答
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().

希望能帮助到你.. :)

于 2018-04-18T11:10:13.547 回答
0

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

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

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

于 2015-07-13T06:09:52.227 回答