私は 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