Проверка с помощью механизма правил - PullRequest
0 голосов
/ 28 сентября 2010

Мы работаем с текстовыми сообщениями (без XML).Наша цель заключается в проверке сообщений, сообщение является действительным, если содержание является правильным.Мы разработали наш собственный язык, определенный в XML, чтобы выразить правила для сообщения.Нам нужно добавить более сложные правила, и мы думаем, что пришло время взглянуть на другую альтернативу и использовать механизм настоящих правил.Мы поддерживаем следующие типы правил:

  • имя в списке значений или регулярное выражение ex {SMITH, MOORE, A *}
  • имя присутствует в сообщении -
  • имя отсутствует в сообщении
  • если условие, то имя = Джон, иначе имя = Джейн Обратите внимание, что условие простое и не содержит никаких логических операторов.

Нам необходимо поддерживать следующие типы правил:

  • , если не указано иное, но условие содержит логические операторы
  • for ... loop:
    • Для всех клиентов в сообщении мы хотим, чтобы по крайней мере один из США и по крайней мере один из Франции
    • Для всех клиентов в сообщении мы хотим по крайней мере пять из США, которые покупают больше, чем1000 долларов в год
    • Для любого клиента с именем Джон фамилия должна быть Doe
  • Всего клиентов с именем Джон <15 </li>
  • Имякомпания совпадает с названием компании в другом месте в гоСообщение

Правила будут зависеть от типа сообщений, которые мы обрабатываем.Итак, мы исследовали несколько существующих решений, таких как:

  • JESS
  • OWL (проверка согласованности)
  • Schematron (путем преобразования сообщения в XML)

Каковы были бы лучшие альтернативы, учитывая, что мы разрабатываем на Java?Еще одна вещь, которую следует учитывать, - это то, что мы должны иметь возможность создавать отчеты об ошибках, такие как описание ошибки, местоположение ошибки (номер строки и столбца).

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

Мне кажется, что вы уже на правильном пути; мои предложения:

  1. Проверяйте ваши текстовые сообщения напрямую с помощью синтаксического анализатора / интерпретатора и применяйте правила к сгенерированным объектам. @Kdeveloper предложил JavaCC для генерации парсера / интерпретатора, и я могу добавить к этому, лично поручившись за ANTLRv3 , который является отличной средой для генерации парсера / интерпретатора / преобразователя в Java (среди Другие языки). Оттуда вы можете использовать Jess или другой движок Java-правил для проверки сгенерированных вами объектов. Возможно, вы могли бы также попытаться закодировать свои правила напрямую в анализатор / интерпретатор, но я бы посоветовал против этого и вместо этого выбрал бы разделение правил, чтобы разделить этапы синтаксического анализа и семантической проверки.
  2. Преобразование ваших текстовых сообщений в XML для применения Schematron также является еще одним жизнеспособным вариантом, но вам, очевидно, придется разбирать текстовые сообщения, чтобы в любом случае перевести их в XML. Для этого я бы по-прежнему предлагал взглянуть на JavaCC или ANTLRv3 и, возможно, заполнить предварительно определенную объектную модель, которая может быть преобразована в XML (например, такую, которая может быть сгенерирована Castor или JAXB из XML-схемы W3C ). Оттуда вы можете применить Schematron к полученному XML.
  3. Я бы сказал, что переход на OWL - самый сложный вариант из ваших предложений, но он может быть самым мощным. Для начала вам, вероятно, понадобится терминология онтологий (TBox) (классы, свойства и т. Д.). чтобы сопоставить ваши данные экземпляра (ABox) в. Оттуда проверка непротиворечивости только поможет вам; многие виды ограничений, которые вы указали как желающие захватить, просто не могут быть представлены в OWL и проверены только с помощью DL-рассуждения. Однако, если вы соедините свою OWL-онтологию с правилами SWRL (например), у вас есть шанс получить большинство из перечисленных вами типов правил. Посмотрите на типы правил и встроенные модули, доступные в SWRL , чтобы увидеть, достаточно ли это выразительно для вас. Если это так, вы можете использовать использование DL-Reasoners с поддержкой SWRL, например Pellet или HermiT . Обратите внимание, что отдельные реализации рассуждений OWL / SWRL, подобные этим, могут реализовывать более или менее спецификацию W3C , поэтому вам нужно будет проверить каждую из них, чтобы определить их применимость.
0 голосов
/ 29 сентября 2010

Если ваши правила статичны (то есть известны во время компиляции), вы можете сделать это с помощью хорошо известного генератора синтаксических анализаторов Java: JavaCC .

...