java - 如何将 CSV 文件中的数据作为事实传递给 Drools?

标签 java drools

我是 JAVA 和 Drools 新手。我有一个包含几千行的 CSV 文件。我想逐行将规则应用于此数据,即将相同的规则应用于 CSV 的每一行。 我有一个 ReadFile 类,它使用 BufferReader 读取 CSV 文件。我将其输出传递给 drools,如以下代码所示。

public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-rules");


             ReadFile data = new ReadFile();
             String line = data.readfile();
            kSession.insert(line);
            kSession.fireAllRules();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

最佳答案

Drools 规则引擎规则触发发生在某些事件发生时。每一次事件的变化都是流口水的规则触发。对于您的情况,我的建议是为您的 CSV 创建一个模型对象,然后根据该模型对象解析每一行,然后将模型对象插入到 drool 的 session 中。例如,假设您有一个包含 4 列(时间戳、名称、参数、值)的 CSV,您可以为每一行创建一个模型,如下所示:

测试.java

public class Test {
    private long timepoint;
    private String name;
    private String parameter;
    private double value;

    public Test(long timepoint, String name, String parameter, double value) {
        this.timepoint = timepoint;
        this.name = name;
        this.parameter = parameter;
        this.value = value;
    }

    public long getTimepoint() {
        return timepoint;
    }

    public void setTimepoint(long timepoint) {
        this.timepoint = timepoint;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getParameter() {
        return parameter;
    }

    public void setParameter(String parameter) {
        this.parameter = parameter;
    }

    public double getValue() {
        return value;
    }

    public void setValue(double value) {
        this.value = value;
    }
}

然后你就可以正常遵循你的代码了:

public static final void main(String[] args) {
        try {
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            KieSession kSession = kContainer.newKieSession("ksession-rules");
            ReadFile data = new ReadFile();
            String line = data.readfile();
            Test test = getTestObjectFromCSV(line) // a function that takes csv and returns Test class obejct
            kSession.insert(test);
            kSession.fireAllRules();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

完成所有 Java 内容之后,您现在可以创建如下规则:

rule "testrule1"
when
  Test(name == "abc")
then
    System.out.println("Test rule is successfully executed");
end

您可以阅读有关流口水的更多信息 here

关于java - 如何将 CSV 文件中的数据作为事实传递给 Drools?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59484922/

相关文章:

java - 使用 java mongo db driver api 将数组作为 MongoDB 中的值进行排序

java - 数据转换错误转换

java - Drools:访问 ArrayList 作为 Map 中的值

java - JFreeChart - 监听系列的更改

java - 在 Java 中使用数组作为哈希键?

java - 如何将地理位置点数据反序列化为Java实体?

java-8 - 如何在 drools 规则中定义和初始化变量

drools - Drools 6.5 中的规则流组与议程组

drools - 如何通过 JBOSS Drools 从 List<String> 获取字符串

java - 无法建立 kmodule 的索引