如果我有查询(例如$invar
和$outvar
),我可以轻松获取Java中的$outvar
列表。有没有办法在规则中收集这些?我可以稍后通过引用$outvar
单独获得结果,但我想使用收集,累积或尽可能使用。
由于
(编辑:展开)
查询$ subject是未绑定变量的问题(按惯例)
query findDatumsParent( Datum $subject, Datum $parent )
DatumLink( $parent, $subject; )
or
( and
DatumLink( $parent, $narrower; )
?findDatumsParent( $subject, $narrower; )
)
end
// and for completeness
declare DatumLink broader: Datum @key narrower: Datum @key end
这可以在规则中使用
rule blah
when
$item: Datum( "name"; )
findDatumsParent( $out, $name; )
then
System.out.println("found %s", $out);
end
但我想要像
这样的东西rule blah
when
$item: Datum( "name"; )
accumulate( findDatumsParent( $out, $name; ); $set: collectSet($out) )
then
System.out.println("found %d items", $out.size());
end
getQueryResults可以让我在Java中设置一个Collection(带有微弱的包装),然后我可以操作集合中的元素,并对它们进行计数。
但有没有办法处理查询在Drools中建立的绑定?
答案 0 :(得分:0)
我不认为您可以在累积中使用反向链接查询,但我可能会弄错,因为没有对可能的交互进行简明定义。
但是,看到你不需要累积的$out
,我建议避免这个问题,只需从规则blah II
运行查询并收集$out
以传统(Java)方式设置。
QueryResults results =
kcontext.getKnowledgeRuntime().getQueryResults( "findDatumsParent", "name" );
List datumList = ...;
for ( QueryResultsRow row : results ) {
Object datumObj = row.get( "$subject" );
System.out.println( Datum.class.cast( datumObj ) );
datumList.add( datumObj );
}
您可能希望将绑定变量作为参数传递给getQueryResults,而不是字符串文字(" name")。