Drools:收集规则中的查询结果

时间:2014-07-21 13:24:16

标签: drools

如果我有查询(例如$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中建立的绑定?

1 个答案:

答案 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")。