【问题标题】:Drools rule that fires when 2 objects share an attribute当 2 个对象共享一个属性时触发的 Drools 规则
【发布时间】:2012-09-30 10:48:16
【问题描述】:

所以我才刚刚开始修补 Drools 并且很享受它,但文档(至少我找到的部分)有点深入。

我正在尝试创建一个规则,当两个对象共享一个属性但似乎无法正确获取条件时将触发该规则。如果我正确阅读了文档,则应该可以: (是的,我使用万智牌规则作为玩耍的基础,因为我很了解它们)

规则“704.5j。如果战场上有两个或更多具有相同鹏洛客类别的鹏洛客,则所有这些都被放入其拥有者的坟墓场。这称为‘鹏洛客唯一性规则’。” 什么时候 $c1 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") , $subtype : Types.get(1) , $c1ID : ID ); $c2 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") , Types.contains($subtype) , ID != $c1ID); 然后 System.out.println("密码唯一性:" + $c1.getName() + " | " + $c2.getName()); $c1.setCurrentZone(ZoneType.Graveyard); $c2.setCurrentZone(ZoneType.Graveyard); 结尾

我必须在 Java 方面这样做吗?

编辑:此外,非常欢迎有关 Drools 的教程/指南建议。

【问题讨论】:

  • 附注:您的示例很难阅读,因为您没有遵循 Java 命名约定。 Types 在我看来像 enum 类,但实际上是 Card 的属性。否则你的例子看起来不错,问题可能出在你在 Java 端实现某些东西的方式上,或者你设置知识的方式上。
  • 是的,这应该可以。你有任何错误吗?看起来不错。
  • 将其简化为尽可能简单的东西,让它发挥作用,然后逐步建立完整的规则。
  • 抱歉,Marko,我会相应地更改未来的 sn-ps。 :) 我会从下往上再试一次。拉维,不,一切都很好。

标签: java drools rule


【解决方案1】:

如果你还没有得到这个工作,也许将一个部分移动到 Then 部分中的一个 IF 以避免在 when 中声明内容然后在同一部分中调用它,

rule "704.5j. If two or more planeswalkers that share a planeswalker type are on the battlefield, all are put into their owners' graveyards. This is called the 'planeswalker uniqueness rule'."
when
    $c1 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") ,($subtype : Types.get(1)));
    $c2 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") ,($subtype2 : Types.get(1)) );
then
    if (($subtype == $subtype2) && ($c1.getID() == $c2.getID()))
    {
       System.out.println("PW Uniqueness: " + $c1.getName() + " | " + $c2.getName());
       $c1.setCurrentZone(ZoneType.Graveyard);
       $c2.setCurrentZone(ZoneType.Graveyard);
    }
end

这有点啰嗦。但我通常避免在 When 中声明和检查相同的变量,我声明了我需要的所有内容(大多数时候使用数组和 eval),然后在 Then 中检查 IF 语句。

也正如@Marko 所说,获取第一个属性,检查它的工作情况,一次只添加一个检查。有时我会使用愚蠢的 IF 等建立大规则,一旦它起作用。我开始缩小尺寸。减少一个工作的东西,比修理一个小的破损的东西更容易:)

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 2015-02-03
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多