Collections 如何在drools guvnor中使用collection?

Collections 如何在drools guvnor中使用collection?,collections,drools,guvnor,Collections,Drools,Guvnor,我想知道如何在LHS中使用规则的集合(将在contains、memberof中使用),该集合可以在Guvnor中管理,其中包含大量元素(可能是上万个)。以黑名单匹配为例,如何高效地维护guvnor中的大黑名单? 有什么想法吗?模型是这样的: declare MyItem end 及 您需要使用该字段的公式。单击列表,然后单击新建公式并写入 this contains myItem 或者在使用memberOf时。现在再次为MyItem使用公式 this memberOf myList 您只需

我想知道如何在LHS中使用规则的集合(将在contains、memberof中使用),该集合可以在Guvnor中管理,其中包含大量元素(可能是上万个)。以黑名单匹配为例,如何高效地维护guvnor中的大黑名单?
有什么想法吗?

模型是这样的:

declare MyItem
end

您需要使用该字段的公式。单击列表,然后单击新建公式并写入

this contains myItem
或者在使用memberOf时。现在再次为MyItem使用公式

this memberOf myList
您只需将每个黑名单项插入工作内存即可。这比使用memberOf或contains更有效。它还使使用Guvnor编写规则变得更容易。如果列表包含字符串,则可以执行以下操作:

declared ListItem 
  name:String 
end
您可以使用Drools从列表中插入规则(也可以在Java代码中触发规则之前执行此操作):


现在,您可以针对黑名单项编写规则。

模型如下:

declare MyItem
end

您需要使用该字段的公式。单击列表,然后单击新建公式并写入

this contains myItem
或者在使用memberOf时。现在再次为MyItem使用公式

this memberOf myList
您只需将每个黑名单项插入工作内存即可。这比使用memberOf或contains更有效。它还使使用Guvnor编写规则变得更容易。如果列表包含字符串,则可以执行以下操作:

declared ListItem 
  name:String 
end
您可以使用Drools从列表中插入规则(也可以在Java代码中触发规则之前执行此操作):


现在,您可以针对黑名单项编写规则。

首先,我建议您在开始优化应用程序设计之前先进行测试。这完全不是问题

然而,如果你有一个巨大的黑名单,那么将其插入工作内存可能是一个缓慢的步骤。事实上,插入将导致它通过Rete网络传播,这可能是一个缓慢的过程,具体取决于有多少规则依赖于它的内容。一旦更新了Rete网络,后续评估应该很快进行

因此,根据规则/会话的运行方式,优化性能的一种技术可能是创建长时间运行的会话,并在启动时插入黑名单。这样,您就可以插入一个“请求”事实并查看触发的是什么,然后收回请求,这样工作内存就为下一个请求做好了准备


不幸的是,这确实引发了一些其他问题。例如,根据您的规则,您可能需要同步对会话的访问,而不是共享会话。这会导致一种情况,即响应速度很快,但也必须等待对方完成,这可能是一个可伸缩性问题。如果这是一个问题,您可以创建一个会话池来支持多个用户同时查询。

首先,我建议您在开始优化应用程序设计之前进行测试。这完全不是问题

然而,如果你有一个巨大的黑名单,那么将其插入工作内存可能是一个缓慢的步骤。事实上,插入将导致它通过Rete网络传播,这可能是一个缓慢的过程,具体取决于有多少规则依赖于它的内容。一旦更新了Rete网络,后续评估应该很快进行

因此,根据规则/会话的运行方式,优化性能的一种技术可能是创建长时间运行的会话,并在启动时插入黑名单。这样,您就可以插入一个“请求”事实并查看触发的是什么,然后收回请求,这样工作内存就为下一个请求做好了准备


不幸的是,这确实引发了一些其他问题。例如,根据您的规则,您可能需要同步对会话的访问,而不是共享会话。这会导致一种情况,即响应速度很快,但也必须等待对方完成,这可能是一个可伸缩性问题。如果这是一个问题,您可以创建一个会话池来支持多个用户同时查询。

谢谢。我仍然想知道,如果我在规则中使用列表,它是否会有效地工作。黑名单存储在数据库中,当一个事实被插入工作内存时,我想检查这个事实的一个字段(比如ID)是否在黑名单中。有没有办法让黑名单对象一直保持在工作记忆中?因此,每个规则匹配都是有效的。“全球”能做到这一点吗?我不太会流口水,再次谢谢你。谢谢。我仍然想知道,如果我在规则中使用列表,它是否会有效地工作。黑名单存储在数据库中,当一个事实被插入工作内存时,我想检查这个事实的一个字段(比如ID)是否在黑名单中。有没有办法让黑名单对象一直保持在工作记忆中?因此,每个规则匹配都是有效的。“全球”能做到这一点吗?我不太会流口水,再次谢谢你。