Droolsを使用して常に最終的に(CTLに似た)クエリ操作を定義しようとしています。このツリーは、パスIDで注釈が付けられたノード(Artifact
s)で構成されています。ツリー内のすべての分割(複数の子を持つ親)は、新しいパスIDを生成し、ファクトSplitFrom(child, parent)
をナレッジベースに挿入することによって表されます。Drools:forallでのサブクエリの使用
基本的には、開始パスIDから、指定されたArtifact
オブジェクトがツリーのすべてのパスに存在するかどうかを確認する必要があります。このOへの私の試みは以下の通りである:
query alwaysFinally(String $type, String $productName, long $parentPathId)
Artifact(type == $type, productName == $productName, pathId == $parentPathId)
or
forall(SplitFrom(parent == $parentPathId, $childPathId := child)
and
?alwaysFinally($type, $productName, $childPathId;))
end
残念ながら、これは、次のエラーが発生:
java.lang.RuntimeException: Build Errors:
Error Messages:
Message [id=1, level=ERROR, path=edu/umn/crisys/sim/agent/cognition/futureworld/rules/process/antecedent/commonAntecedents.drl, line=47, column=0
text=[ERR 102] Line 47:6 mismatched input '?' in query]
Message [id=2, level=ERROR, path=edu/umn/crisys/sim/agent/cognition/futureworld/rules/process/antecedent/commonAntecedents.drl, line=0, column=0
text=Parser returned a null Package]
...
「私は、いくつかの異なる方法で括弧を挿入してプレイしましたが、私はドンそれが本当の問題だとは思わない。
java.lang.ClassCastException: org.drools.core.rule.QueryElement cannot be cast to org.drools.core.rule.Pattern
at org.drools.compiler.rule.builder.ForallBuilder.build(ForallBuilder.java:57)
at org.drools.compiler.rule.builder.ForallBuilder.build(ForallBuilder.java:32)
at org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:66)
at org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:36)
at org.drools.compiler.rule.builder.GroupElementBuilder.build(GroupElementBuilder.java:66)
at org.drools.compiler.rule.builder.RuleBuilder.build(RuleBuilder.java:97)
at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.addRule(KnowledgeBuilderImpl.java:1820)
at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileRules(KnowledgeBuilderImpl.java:1111)
at org.drools.compiler.builder.impl.KnowledgeBuilderImpl.compileAllRules(KnowledgeBuilderImpl.java:989)
at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildRules(CompositeKnowledgeBuilderImpl.java:260)
at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildPackages(CompositeKnowledgeBuilderImpl.java:121)
at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:105)
at org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages(AbstractKieModule.java:243)
at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:64)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:230)
at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:198)
私はクエリはPatternオブジェクトではありませんので、アキュムレータはここで働いてますとは思わない:私はand
を削除し、コンマまたは改行で置き換えた場合、私は次のエラーを取得します。
誰でもDroolsでこれを表現する方法はありますか?
おそらく私は説明が間違っています。私が実行すると、 "or"の後ろの部分があたかもあたかもあたかも指定された親を持つsplitFromの子パスがあり、子パスが常に最終的に成果物を含んでいるかのように動作し、真を返します。言い換えれば、現実的に定量化されているように振舞う。私が望むのはsplitFromsのすべての子であり、指定された親と各子パス(またはそこからのパス)にアーティファクトが含まれている場合はtrueを返します。私は子供のパスIDを収集してからそれらについてフォールリングを行うことを考えましたが、もう一度、その上でクエリを呼び出すことは機能していません。 – desilvai