可以对存储在关系数据库中的数据进行推理(例如使用 HIbernate)

Posted

技术标签:

【中文标题】可以对存储在关系数据库中的数据进行推理(例如使用 HIbernate)【英文标题】:could drools reason over data stored in a relational database (using HIbernate for example) 【发布时间】:2012-04-17 00:38:08 【问题描述】:

我必须使用drools 来实现应用程序,但是,DROOLS 似乎无法同时推理大量对象。 我想知道它是否可以推理存储在关系数据库中而不是工作内存中的数据。

感谢您的帮助:)

【问题讨论】:

相关类型:***.com/questions/8509993 感谢您提供有用的链接 你想让 Drools 持久化数据,而不是完全在内存中吗?并透明地推理持久层并将结果保存回它? 是的,这就是我真正想要的,因为 WM 似乎不支持非常大容量的数据。:) 请原谅我蹩脚的英语:) 【参考方案1】:

你的问题很广泛。答案是为了对数据进行推理,除非您使用存储过程,否则任何应用程序(无论是否流口水)都需要将数据加载到 JVM 中。然后,可以在 Drools 应用程序中将数据插入到工作内存中(请注意,这不会导致任何复制操作,因为 drools 将标准应用程序 POJO 用作事实),或者可以使用“ from" 条件元素。 Hibernate 也使用 POJO,Drools 使用它们没有问题。

“DROOLS 不能同时推理大量对象”

不知道你的意思是什么?多少是一个大数字?我亲自使用过一些 drools 应用程序,它们在工作内存的每个实例中同时使用超过一百万个事实,规则执行的平均响应时间在 100 秒毫秒级。在这里,您可以看到一位顾问的演示文稿,该顾问参与了一个项目,其中规则必须实时查询和推理超过 3000 万条记录的历史数据:http://vimeo.com/27209589。为此,他使用了一个 noSQL 数据库。

当然,大型应用程序在设计架构时需要更加小心,但对于 Drools 以及任何技术都是如此。如果您详细说明您的用例,我们可以为您提供更具体的建议。还建议查看 Drools 邮件列表,因为那里有很多关于应用程序设计的好建议。

希望它有助于澄清。

【讨论】:

感谢您的回复。这里有一些细节。我正在开发一个银行欺诈检测应用程序,正如您所知,对于给定的银行,每天都会完成数十万笔交易(可能是数百万笔)。我想要做的是,在每一天结束时,将这些对象(交易)交给drools(将它们放在工作记忆中)和一些有关银行客户的历史数据(数十万或百万)并等待drools的回应。 ,但我得到的是:-响应时间非常慢。 -outofmemoryerror java 堆空间。感谢您的帮助 :) :) 原谅我的英语蹩脚 :) 这个用例与我上面链接的视频演示中的用例非常相似。通常,历史数据不应该急切地加载到工作内存中,因为它很少作为一个整体使用。可以通过在规则中使用“来自”CE 来按需获取历史数据,这样您就可以只获取您需要的数据。为此使用缓存或 noSQL 数据库将有助于缩短响应时间。 非常感谢您对这个非常有用的回复,我会尝试按照这些步骤进行操作,如果我遇到问题,我会来找您帮助我解决问题。:) 请原谅我的坏英语:) 什么是“请注意,这不会导致任何复制操作,因为 drools 与标准应用程序 POJO 作为事实一起使用?”中的“复制操作”? 当您将对象插入会话时,它所做的只是使引擎可以使用对象引用,而不是将原始对象中的任何数据复制或映射到不同的数据结构中。

以上是关于可以对存储在关系数据库中的数据进行推理(例如使用 HIbernate)的主要内容,如果未能解决你的问题,请参考以下文章

机器不学习:基于知识图谱推理的关系推演

是否有任何免费的猫头鹰推理器可以在不将所有数据加载到内存的情况下进行推理?

如何从存储在数据库中的信息中显示树?

与laravel 4中的数据透视表存储关系

表示关系数据库中的排序

我想知道我是不是可以使用 Prolog 进行解析推理