Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Drools-使用一条规则插入相同类型的多个事实_Java_Drools - Fatal编程技术网

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

Java Drools-使用一条规则插入相同类型的多个事实,java,drools,Java,Drools,我是Drools的新手,我已经完成了一些在线教程并阅读了文档。我确信我将要解释的有一个我错过的琐碎的解决方案,但不管怎样,我将把它摆出来 我的drools文件中只有一条规则,还有一个从文本文件中读取信息的对象 代码与此类似: public static final void main(String[] args) { try { ObjectArchive arch = ArchiveFactory.openArchive(new File("dwc

我是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;
    }

我不知道到底发生了什么,因为我没有您的对象文件来运行测试,但只要在eclipse audit视图中打开您的日志文件,您就会立即看到插入的对象以及哪些对象激活了规则

该规则将为每个具有scientificName的对象触发一次!=空

另外,如果您有一个定义getScientificName()方法的更专门的类/接口,则您的规则不应该尝试匹配对象。例如,如果您有一个名为“MyDwcClass”的类,则应编写如下规则:

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

我不知道到底发生了什么,因为我没有您的对象文件来运行测试,但只要在eclipse audit视图中打开您的日志文件,您就会立即看到插入的对象以及哪些对象激活了规则

该规则将为每个具有scientificName的对象触发一次!=空

另外,如果您有一个定义getScientificName()方法的更专门的类/接口,则您的规则不应该尝试匹配对象。例如,如果您有一个名为“MyDwcClass”的类,则应编写如下规则:

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

你能粘贴你的规则吗?小更新,创建了另一个类只是为了测试(带有一个字符串属性的基本类),它工作得很好。看起来可能与阻止会话中有多个对象的特定类有关?默认情况下,Drools使用标识在工作内存中存储对象。除非将配置选项更改为使用相等,否则同一类的实例数量可以根据需要而定。建议:使用WorkingMemoryConsoleLogger运行测试,将审核日志打印到控制台,并将控制台日志粘贴到此处。。。在将对象插入工作内存之前,最好先打印每个对象的scientificName属性,以确保它们不为空。是否可以粘贴规则?小更新,创建另一个类只是为了测试(具有一个字符串属性的基本类),效果很好。看起来可能与阻止会话中有多个对象的特定类有关?默认情况下,Drools使用标识在工作内存中存储对象。除非将配置选项更改为使用相等,否则同一类的实例数量可以根据需要而定。建议:使用WorkingMemoryConsoleLogger运行测试,将审核日志打印到控制台,并将控制台日志粘贴到此处。。。在将对象插入工作内存之前,最好先打印每个对象的scientificName属性,以确保它们不为空。是的,我可能应该尝试一个更通用的示例。我已经如上所述修改了规则,但是审计没有显示任何输出,并且该规则仍然只触发了一次。如果我触发while循环中的所有规则,它仍然只触发一次,但获得了正确的信息。好的,看来问题在于正在使用的库。我接受你的答案,因为这是一个更有效的方法来写规则。谢谢你的帮助!是的,我可能应该尝试一个更一般的例子。我已经如上所述修改了规则,但是审计没有显示任何输出,并且该规则仍然只触发了一次。如果我触发while循环中的所有规则,它仍然只触发一次,但获得了正确的信息。好的,看来问题在于正在使用的库。我接受你的答案,因为这是一个更有效的方法来写规则。谢谢你的帮助!