地图迭代流口水列表 DRL.



我正在尝试迭代一个映射列表,如下所示:

[
  {
    "endOffset": 2913,
    "coreference": "Tehran",
    "entity": "a country",
    "beginOffset": 2904
  },
  {
    "endOffset": 3055,
    "coreference": "Bashar al-Assad",
    "beginOffset": 3052
  },
  {
    "endOffset": 3130,
    "coreference": "Bashar",
    "beginOffset": 3128
  }
]

我正在执行的代码块如下:

PojoCorefList pojoCorefList=new PojoCorefList();
List<Map<String,String>> corefList=new ArrayList<Map<String,String>>();
Map<String,String> testMap=new LinkedHashMap<>();
testMap.put("beginOffset", "3052");
testMap.put("coreference", "Bashar al-Assad");
testMap.put("endOffset", "3055");
corefList.add(testMap);
Map<String,String> testMap2=new LinkedHashMap<>();
testMap2.put("beginOffset", "3130");
testMap2.put("coreference", "Bashar");
testMap2.put("endOffset", "3128");
corefList.add(testMap2);
Map<String,String> testMap3=new LinkedHashMap<>();
testMap3.put("beginOffset", "2913");
testMap3.put("coreference", "Tehran");
testMap3.put("endOffset", "2904");
corefList.add(testMap3);
pojoCorefList.setCityPlaces(corefList);
ksession.insert(pojoCorefList);

下面是 PojoCorefList 类:

public static class PojoCorefList {
    private List<Map<String,String>> cityPlaces;
    public List<Map<String,String>> getCityPlaces() {
         return cityPlaces;
    }
    public void setCityPlaces(List<Map<String,String>> cityPlaces) {
         this.cityPlaces = cityPlaces;
    }
}

我尝试过的drl语法如下:

rule "List of Maps Testing"
    salience 1
    when
        $c : PojoCorefList($coref : cityPlaces)
    $item : List() from $coref
    entry : Entry() from $item.entrySet()
    //value: String() from entry.getValue()
    //Boolean(booleanValue :true) from value=="Tehran"
    then
      System.out.println("List Maps Testing: list is - "+$item);
end 

我相信,我正在迭代$coref列表,现在我应该有一个地图,但是如果我尝试从$item获取 entrySet((,我会得到如下异常:

Unable to Analyse Expression $item.entrySet():
[Error: unable to resolve method using strict-mode: java.util.List.entrySet()]
[Near : {... $item.entrySet() ....}]
                   ^ : [Rule name='List of Maps Testing']

Drools 不懂泛型。但是,如果您提供正确的类,它应该可以工作。请注意,from collection循环访问集合。

  $c : PojoCorefList($coref : cityPlaces)
  $m : HashMap() from $coref  // cityPlaces are lists of Maps
  entry : Entry() from $m.entrySet()

或使用

  value : String() from $m.values()

(这可能取决于流口水版本。

如果您

使用的是 Drools 6.4 及更高版本,您也可以使用 OOPath 语法。它大大提高了LHS的紧凑性。

您的案例可能仅如下所示:

$c : PojoCorefList($entry :/cityPlaces/entrySet(

其中$entry的类型为 Entry((。您可以在此处阅读有关OOPath的更多信息:https://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html/ch10.html#d0e13581

最新更新