Drools 将一个列表(标签)与另一个列表匹配并检测公共元素的存在

Drools 将一个列表(标签)与另一个列表匹配并检测公共元素的存在,drools,drools-planner,Drools,Drools Planner,我的要求是匹配标签。在本例中,此特定的HourConstraint检查分配给Hour(23)的TeacherHour 具体地说,它检查TeacherHour.attributes[“tags”]中的值[“asst\u ct”,“teacher\u john\u smith”]和至少检测到一个匹配项,在这种情况下检测到两个匹配项(都是“asst\u ct”和“teacher\u john\u smith”) TeacherHour: 身份证号码:47 分配的小时数:空 属性:地图 “标签”:[“助

我的要求是匹配标签。在本例中,此特定的
HourConstraint
检查分配给
Hour(23)
TeacherHour

具体地说,它检查
TeacherHour.attributes[“tags”]
中的值
[“asst\u ct”,“teacher\u john\u smith”]
至少检测到一个匹配项,在这种情况下检测到两个匹配项(都是
“asst\u ct”
“teacher\u john\u smith”

TeacherHour:
身份证号码:47
分配的小时数:空
属性:地图
“标签”:[“助理”、“无繁重的职责”、“有点无聊”、“教师约翰·史密斯”]
“另一个_属性”:[…]
小时培训:
小时:小时(23)
属性:“标记”
价值观清单:[“助理”、“教师约翰·史密斯”]

问题:如何检测两个列表之间的公共元素的存在(正确或错误)

Drools Expert拥有
成员
包含
,但他们检查标量与集合,而不是集合与集合

我认为有两种可能的方式:

  • 引入一个函数
    布尔isIntersecting(列表,列表)
    ,并告诉Drools使用该函数进行真理检查
  • TeacherHour.attributes[]
    实现为字符串而不是列表,并将
    HourConstraint.valueslist
    实现为可匹配该列表的正则表达式

  • 有几个选择。最直接的方法是使用Collections类为您完成以下任务:

    rule X
    when
        $t: TeacherHour( )
        HourConstraint( Collections.disjoint( $t.attributes["tags"], values_list ) == false )
    ...
    
    如果这是您在规则中经常使用的东西,那么我建议将该函数包装到一个由Drools支持的可插入操作符中。假设您将运算符命名为“intersect”,然后可以这样编写规则:

    rule X
    when
        $t: TeacherHour( )
        HourConstraint( values_list intersect $t.attributes["tags"] )
    ...
    
    第三个选项是使用“from”,但在运行时效率较低,因为它会导致第一个列表上的迭代:

    rule X
    when
        $t: TeacherHour( )
        $tag : String() from $t.attributes["tags"]
        exists( HourConstraint( values_list contains $tag ) )
    ...
    

    我会选择集合。不相交。我应该使用set数据类型吗?另外,你能给我介绍一下“可插拔的操作员”吗?试试这个:。或者复制并粘贴该类,使其适应您的需要:
    rule X
    when
        $t: TeacherHour( )
        $tag : String() from $t.attributes["tags"]
        exists( HourConstraint( values_list contains $tag ) )
    ...