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

Java 如何将CSV文件中的数据作为事实传递给Drools?,java,drools,Java,Drools,我对JAVA和Drools都是新手。我有一个有几千行的CSV文件。我希望将规则逐行应用于此数据,即将相同的规则应用于CSV的每一行。 我有一个ReadFile类,它使用BufferReader读取CSV文件。我将其输出传递给drools,如下代码所示 public static final void main(String[] args) { try { // load up the knowledge base KieServic

我对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规则引擎规则触发发生在某些事件上。事件的每一个变化都是drool中的一个规则触发器。在您的情况下,我的建议是为CSV创建一个模型对象,然后基于该模型对象解析每一行,然后在drool的会话中插入该模型对象。例如,假设您有一个包含4列(时间戳、名称、参数、值)的CSV,您可以为每一行创建一个模型,如下所示:

Test.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

您可以阅读更多关于drools的内容

,因为我必须将规则应用于csv中的所有行。我是否必须在这些行上循环才能将每一行作为事实插入??像下面这样的东西???对于(int i=0;i<10;i++){String line=data.readfile().get(i);kSession.insert(line);kSession.fireAllRules();}是的,您必须逐行插入,但不要插入行字符串,请尝试将其转换为模型对象。这将有助于根据事实编写规则。看看我分享的例子