简体   繁体   English

地图迭代Drools Drl列表

[英]list of map iteration drools drl

I am trying to iterate a list of map as below: 我正在尝试迭代地图列表,如下所示:

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

The code block, I am executing is as below: 我正在执行的代码块如下:

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);

Here is the PojoCorefList class as below: 这是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;
    }
}

The drl syntax, I have tried is as below : 我尝试过的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 

I believe, I am iterating $coref list and now I should be having a map but if I try to get entrySet() from $item, I am getting exception as below: 我相信,我正在迭代$ 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 doesn't understand generics. Drools不了解泛型。 But if you supply the correct classes, it should work. 但是,如果您提供正确的类,它应该可以工作。 Note that from collection iterates the collection. 请注意, from collection会迭代该集合。

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

or use 或使用

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

(This may depend on the Drools version.) (这可能取决于Drools版本。)

You can also use OOPath syntax, if you are on Drools 6.4 and higher. 如果您使用的是Drools 6.4及更高版本,则也可以使用OOPath语法。 It much improves the LHS compactness. 它大大提高了LHS的紧凑性。

Your case can look like just this one constraint: 您的情况可能看起来像这样一个约束:

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

where $entry is of type Entry(). 其中$ entry是Entry()类型。 You can read more about OOPath here: https://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html/ch10.html#d0e13581 您可以在此处阅读有关OOPath的更多信息: https ://docs.jboss.org/drools/release/6.5.0.Final/drools-docs/html/ch10.html#d0e13581

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM