如何将 CSV 文件中的数据作为事实传递给 Drools?
How to pass data from CSV file as facts to Drools?
我是 JAVA 和 Drools 的新手。我有一个包含几千行的 CSV 文件。我想逐行将规则应用于此数据,即相同的规则将应用于 CSV 的每一行。
我有一个 ReadFile class,它使用 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 创建一个模型对象,然后根据该模型对象解析每一行,然后将模型对象插入流口水的会话中。例如,假设您有一个包含 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
你可以阅读更多关于流口水的内容here
我是 JAVA 和 Drools 的新手。我有一个包含几千行的 CSV 文件。我想逐行将规则应用于此数据,即相同的规则将应用于 CSV 的每一行。 我有一个 ReadFile class,它使用 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 创建一个模型对象,然后根据该模型对象解析每一行,然后将模型对象插入流口水的会话中。例如,假设您有一个包含 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
你可以阅读更多关于流口水的内容here