【问题标题】:Drools: collecting results of a query within a ruleDrools:在规则中收集查询结果
【发布时间】:2014-07-21 13:24:16
【问题描述】:

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

【问题讨论】:

  • 这非常不清楚,尤其是没有查询文本和关于您希望如何、何时、何地获得什么的描述(用 Java 表示)。

标签: drools


【解决方案1】:

我认为您不能在累积中使用反向链接查询,但我可能弄错了,因为可能的交互没有简明的定义。

但是,鉴于您不需要 $outs 的累积集,我建议避免此问题,只需从规则 blah II 运行查询并收集传统 (Java) 中的 $out 集方式。

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,而不是字符串文字(“名称”)。

【讨论】:

  • 但不是我想要的。我希望能够在规则中计算查询结果 - 使用 Java 感觉很混乱,并且比我想要的更多地传播代码。我不想有效地内联查询,因为我正在复制代码并在调整内容时提出问题。 Ofc,这可能是不可能的(这将是一种耻辱)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多