使用规则引擎验证

时间:2010-09-28 19:59:49

标签: java owl rule-engine

我们处理基于文本的消息(无XML)。我们的目标是验证消息,如果内容正确,则消息有效。我们开发了自己的XML语言定义语言来表达消息规则。我们需要添加更复杂的规则,我们认为现在是时候看看其他替代方案并使用真正的规则引擎了。我们支持这些类型的规则:

  • 值列表中的名称或常规名称 表达ex {SMITH,MOORE,A *}
  • 名称出现在消息中 -
  • 名称不在消息中
  • if condition then name = John else name = Jane 请注意,条件很简单,不包含任何逻辑运算符。

我们需要支持这些类型的规则:

  • if if else,但条件包含逻辑运算符
  • for ... loop:
    • 对于消息中的所有客户,我们希望至少有一个来自美国,至少一个来自法国
    • 对于消息中的所有客户,我们希望至少有五位来自美国且每年购买超过1000美元的客户
    • 对于姓名为John的任何客户,姓氏必须为Doe
  • 名称为John< 15
  • 公司名称等于消息
  • 中其他位置的公司名称

规则取决于我们处理的消息类型。所以我们正在调查几个现有的解决方案,如:

  • JESS
  • OWL(一致性检查)
  • Schematron(通过转换XML中的消息)

考虑到我们使用Java开发,最好的选择是什么?另一件需要考虑的事情是我们应该能够进行错误报告,如错误描述,错误位置(行号和列号)。

2 个答案:

答案 0 :(得分:1)

听起来我已经走在正确的轨道上了;我的建议是:

  1. 使用解析器/解释器直接检查基于文本的消息,并对生成的对象应用规则。 @Kdeveloper建议JavaCC生成解析器/解释器,我可以通过个人担保ANTLRv3来添加它,这是一个用Java(以及其他语言)生成解析器/解释器/转换器的优秀环境。从那里,您可以使用Jess或其他Java规则引擎来验证您生成的对象。您也可以尝试直接将规则编码到解析器/解释器中,但我建议不要这样做,而是选择将规则分离出来以保持解析和语义验证步骤分离。
  2. 将基于文本的消息转换为XML以应用Schematron也是另一种可行的选择,但您显然需要解析文本消息以使其无论如何都能进入XML。为此,我仍然建议查看JavaCC或ANTLRv3,并且可能填充预先确定的对象模型,该模型可以编组为XML(例如可以由CastorJAXB生成的模型。一个W3C XML Schema)。从那里,您可以将Schematron应用于生成的XML。
  3. 我认为转换为OWL是你建议中最棘手的选择,但可能是最强大的。首先,您可能需要ontology terminology (TBox)(类,属性等)。将instance data (ABox)映射到。{从那里开始,一致性检查只会让你到目前为止;您已经概述为要捕获的许多约束都无法在OWL中表示,并且仅使用DL推理器进行验证。但是,如果您将OWL本体与SWRL规则相结合(例如),则有可能捕获您概述的大部分规则类型。查看规则类型和built-ins available in SWRL,看看它是否足够表达。如果是,您可以使用具有SWRL支持的DL-Reasoners,例如PelletHermiT。请注意,诸如此类的OWL / SWRL推理器的各个实现可能会实现W3C specification的更多或更少,因此您需要检查每个实现以确定它们的适用性。

答案 1 :(得分:0)

如果您的规则是静态的(即在编译时已知),您可以使用众所周知的Java解析器生成器进行此操作:JavaCC