【发布时间】:2011-02-23 06:12:56
【问题描述】:
我有一组具有属性的对象和一堆规则,当应用于这组对象时,这些规则提供了这些对象的一个子集。为了更容易理解,我将提供一个具体的例子。
我的对象是人,每个人都有三个属性:原籍国、性别和年龄组(所有属性都是离散的)。我有一堆规则,比如“所有来自美国的男性”,它们对应于这个更大对象集的子集。
我正在寻找一个现有的 Java“推理引擎”或类似的东西,它能够从规则映射到一个人的子集,或者关于如何创建我自己的建议。我已经阅读了规则引擎,但该术语似乎专门用于将业务规则外部化的专家系统,并且通常不包括任何高级形式的推理。以下是我必须处理的更复杂场景的一些示例:
我需要规则的结合。因此,当同时出现“包括所有男性”和“排除 10 至 20 岁年龄段的所有美国人”时,我只对美国以外的男性以及美国境内 10 至 20 岁以下的男性感兴趣。 20 岁年龄段。
规则可能有不同的优先级(明确定义)。因此,“排除所有男性”的规则将覆盖“包括所有美国男性”的规则。
规则可能有冲突。所以我可以同时设置“包括所有男性”和“排除所有男性”,在这种情况下,必须优先解决问题。
规则是对称的。所以“包括所有男性”相当于“排除所有女性”。
规则(或更确切地说是子集)可能具有与之关联的元规则(明确定义)。在应用原始规则或通过推理达到子集的任何情况下,都必须应用这些元规则。因此,如果“排除美国”的元规则附加到“包括所有男性”规则,并且我为引擎提供“排除所有女性”规则,它应该能够推断出“排除所有女性”子集相当于“包括所有男性”子集,因此另外应用“排除美国”规则。
我很可能没有第 5 项,但我确实需要提到的所有其他属性。我的规则和对象都存储在数据库中,并且可以在任何阶段更新,因此我需要在需要时实例化“推理引擎”并在之后销毁它。
【问题讨论】:
-
数据是否在 RDBMS 中?为什么不在数据级别尝试呢?听起来你更像是我需要一个报告工具。
-
数据在 RDBMS 中,是的,但我不确定报告工具是否足够。我的经验很少,但似乎复杂性加上实时使用而不是报告会使它不可行?
-
我认为您可以在业务分析方面做更多的工作。从您的描述中,我看到将业务需求翻译成技术术语的效果不佳 - 例如:“因此,“排除所有男性”的规则将覆盖“包括所有美国男性”的规则。 - 这可以解释为单一规则“排除美国以外的所有男性”,并且在任何运行规则引擎的权力范围内。我建议你阅读一些关于 NLP 和形式逻辑的内容。最后一件事 - 避免优先事项,就像瘟疫一样,这是最简单的最终导致无法维护的混乱的方式。订购也很糟糕,但没有那么糟糕。
-
显然,在 StackOverflow 上以易于理解的方式传递业务需求是很困难的,但我相信我们对需求有很好的理解。当然,任何规则引擎都可以处理“排除美国以外的所有男性”的规则,但是哪些规则引擎可以结合“排除所有男性”和“包括所有美国男性”? NLP 不相关,因为这些规则不是用自然语言捕获的,而且我对形式逻辑有很好的理解,这绝对可以解决这个问题,但我不知道有任何 java 实现足以表达这些规则的推断.
-
是我还是你正在寻找类似 PROLOG 的推理引擎的 java 实现?
标签: java logic rules rule-engine inference-engine