Drools-使用一个规则插入相同类型的多个事实

时间:2012-07-12 16:07:38

标签: java drools

我是Drools的新手,我已经完成了在线发现的一些教程并阅读了文档。我确信我要解释的是一个我无法解决的微不足道的解决方案,但无论如何我都会将其解决。

我的drools文件中有一条规则,一个从文本文件中读取信息的对象。

代码看起来类似于:

   public static final void main(String[] args) {
        try {
            ObjectArchive arch = ArchiveFactory.openArchive(new File("dwc.txt"));
            Iterator<Object> iter = arch.iteratorDwc();

            // load up the knowledge base
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger =  KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            while(iter.hasNext()) {
                Object dwcRecord = iter.next();
                ksession.insert(dwcRecord);
            }
            System.out.println(ksession.getFactCount());
            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("dwcrules.drl"), ResourceType.DRL);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }

我有一个简单的规则文件,用于检查所述对象的属性是否为空,如果为真,则打印出该对象。

现在,问题。

如果我添加一个对象(没有while循环),则会触发规则并且一切正常。但是,如果我向会话中添加多个对象然后触发规则,它往往只抓住最后一个,或者触发但是打印出一个空值。

那么,为什么我无法添加相同类型的多个事实呢?或者我错过了什么阻止我能够对多个事实发出同样的规则?

提前致谢。

编辑:对不起,这是规则:

rule "Scientific Name"
when 
    dwc : Object(dwc.getScientificName != null)
then
    System.out.println(dwc);
 end

2 个答案:

答案 0 :(得分:1)

我不确切知道发生了什么,因为我没有你的目标文件来运行测试,只是在eclipse审计视图中打开你的日志文件,你会立即看到插入的对象和激活规则。

对于每个具有scientificName!= null的对象,规则将触发一次。

此外,如果您有一个更专业的类/接口来定义getScientificName()方法,那么您的规则不应该尝试匹配Object。例如,如果你有一个名为“MyDwcClass”的类,你应该写这样的规则:

rule "Scientific Name"
when 
    dwc : MyDwcClass( scientificName != null )
then
    System.out.println(dwc);
end

答案 1 :(得分:0)

你在循环之外触发规则,所以它只触发最后一个。

ksession.fireAllRules();