当前位置: 首页 > 知识库问答 >
问题:

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

颛孙玉石
2023-03-14

我尝试使用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我认为它应该可以工作,但我还没有找到一种方法来指定一个能够提供预期结果的查询。

提前谢谢你。

共有1个答案

皇甫礼骞
2023-03-14

简短的回答:

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

详细回答:

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

BC允许规则“Test”通过查询“isThereAnyA”检索As,并可能调用其他查询,但不允许查找“A”和“go2”之间的“production”链接。原因是“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”(仍然)存在时,才会出现这种情况。但是,您会注意到,a的特定实例与导致其断言的特定字符串之间的连接仍然缺失。

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

  • 显式连接:new A($s ) // $s绑定到go2
  • 使用“插入逻辑”建立“go2”和A之间的依赖关系,然后查询TruthMaintenanceSystem

基于TMS的是我的初步选择,但这也取决于您的确切要求。

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

希望这对Davide有帮助

 类似资料:
  • 为什么我会得到不满意的链接错误? 细节如下: 本机方法的原型及其在我的Java代码中的调用是这样的: 私有本机long sampleFunction(long[][]twoDimArray,long number); p.SampleFunction(twoDimArray,number); 本机方法在VC++代码中的原型是这样的: JNIEXPORT jlong JNICALL Java_MyC

  • 我是一名学生,正在为我的学校项目开发OCR功能。到目前为止,我能够成功地实现这些功能并运行应用程序。 我在Android Studio1.5.1上有我的应用程序,并且能够在我的旧设备三星银河笔记3应用编程接口21上运行它。最近,我将我的设备更改为三星银河笔记5应用编程接口22,每当我试图运行光学字符识别功能时,应用程序就会崩溃。 以下是日志: 致命异常:java。lang.IllegalState

  • 我正在尝试反转一个链表,我为此编写了代码。但是,当我在反转后打印列表时,输出有点不完整。 产量:120 110 100

  • 我真的很难修复我的代码。我已经创建了一个双链接列表,我正试图反向遍历它。 有什么想法吗? 这是我的代码:Node。爪哇: 下面是第二个类“DNode.java”: 最后,这里是双链接列表。java:(重写另一个类“链表”中的“添加”和“删除”方法) 公共类双链接列表扩展了链接列表{ 我可以向前打印列表,但向后打印时会遇到无限循环。有什么想法吗? 谢谢

  • 问题内容: 如何创建一个链接到? 假设已在下方建立,而您目前在中。当您这样做时,您将直接转到。 问题答案: 符号或软链接(文件或目录,更灵活,可自我记录) 硬链接(仅文件,灵活性较差且无法自我记录) 详细信息:man ln 就像一个新目录。要避免出现 “不是目录:没有这样的文件或目录” 错误,例如@trlkly注释,请在目标中使用相对路径,即使用示例:

  • 我试图打印一个双链接列表,从tail元素开始,以first元素结束。我下面的代码就是这样做的,但出于某种原因,我也返回了被删除的项目。当我从头到尾打印列表时,它不会这样做。Idk,如果是toString导致了这个或dequed方法。我把两者都包括在内。