1

私は Drools を初めて使用し、オンラインで見つかったいくつかのチュートリアルを完了し、ドキュメントを読みました。これから説明することには、私が見逃した些細な解決策があると確信していますが、それでも説明します。

drools ファイルに 1 つのルールと、テキスト ファイルからその情報を読み取るオブジェクトがあります。

コードは次のようになります。

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

上記のオブジェクトのプロパティが null でないかどうかをチェックし、これが true の場合はオブジェクトを出力する単純なルール ファイルがあります。

さて、問題です。

1 つのオブジェクト (while ループなし) を追加すると、ルールが実行され、すべてがうまくいきます。ただし、セッションに複数のオブジェクトを追加してからルールを起動すると、最後のオブジェクトを取得するか、起動しても 1 つの null が出力される傾向があります。

では、同じタイプの複数のファクトを追加できないのはなぜですか? または、複数のファクトに対して同じルールを実行できない原因は何ですか?

前もって感謝します。

編集:申し訳ありませんが、ここにルールがあります:

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

1 に答える 1

1

テストを実行するためのオブジェクト ファイルがないため、何が起こっているのか正確にはわかりませんが、Eclipse 監査ビューでログ ファイルを開くだけで、挿入されたオブジェクトと、どのオブジェクトがルール。

このルールは、scientificName != null を持つオブジェクトごとに 1 回実行されます。

また、 getScientificName() メソッドを定義する、より特化したクラス/インターフェースがある場合、ルールは Object との一致を試みるべきではありません。たとえば、「MyDwcClass」という名前のクラスがある場合、次のようにルールを記述する必要があります。

rule "Scientific Name"
when 
    dwc : MyDwcClass( scientificName != null )
then
    System.out.println(dwc);
end
于 2012-07-12T17:24:52.417 に答える