gpt4 book ai didi

drools - 如何使用 Drools 向后链接来列出满足目标所需的初始事实?

转载 作者:行者123 更新时间:2023-12-02 18:04:01 26 4
gpt4 key购买 nike

我正在尝试使用 Drools 向后链接来找出需要哪些事实才能将对象插入到工作内存中。在下面的示例中,我期望得到事实“go2”。

rule "ins a"
when
String( this == "go2" )
then
insert(new A());
end


rule "Run"
when
then
insert(new String("go1"));
end

rule "Test isThereAnyA"
when
String( this == "go1" )
isThereAnyA(a;)
then
System.out.println( "you can get " + a );
end

query isThereAnyA (A a)
a := A()
end

我一直在查看官方文档中的示例 http://docs.jboss.org/drools/release/6.1.0.Final/drools-docs/html_single/index.html#d0e21289但它们显示了不同的情况(这些示例中的规则不会创建新的事实)

从图表来看 http://docs.jboss.org/drools/release/6.1.0.Final/drools-docs/html_single/index.html#d0e21240我认为它应该可以工作,但我还没有找到一种方法来指定给我预期结果的查询。

提前谢谢您。

最佳答案

简短回答:

不幸的是,向后链接不能用于此目的。在这种情况下,它不会给你“go2”。

长答案:

在 Drools 中,向后链接 (BC) 是一种以目标驱动方式查询 WM 的方法,而不是追溯正常前向链接推理过程的推导图的方法。

BC 允许规则“Test”通过查询“isThereAnyA”检索 As,并可能调用其他查询,但不允许找到“A”和“go2”之间的“生产”链接。原因是“when..then..insert..”不会在触发事实和断言结论之间创建任何链接,并且向后链接不会改变它。

你可以用 BC 做的是:

query isThereAnyA_InPresenceOfA_String( A a )
isThereAnyString( $s ; )
a := A()
end
query isThereAnyString( String $s )
$s := String( this == "go2" )
end

仅当字符串“go2”(仍然)存在时,才会选择 As。但是您会注意到 A 的特定实例与导致其断言的特定 String 之间的连接仍然缺失。

要准确了解哪些对象导致了另一个对象的断言,您可能需要不同的方法。选项包括:

  • 明确连接:new A( $s )//$s 绑定(bind)到“go2”
  • 使用“insertLogical”在“go2”和A之间建立依赖关系,然后查询TruthMaintenanceSystem

基于 TMS 的方案是我的初步选择,但这也取决于您的具体要求。

这个用例很常见,可能还有其他选项,包括一些在 6.3 中开发的实验性选项,但我想先问几个问题。也就是说:您什么时候需要准确地发现事实——在规则执行期间,还是“离线”?它纯粹是为了审计目的,还是会影响您的业务逻辑?您可以使用多个规则来断言“同一”对象吗?

希望这有帮助达维德

关于drools - 如何使用 Drools 向后链接来列出满足目标所需的初始事实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com