0

テキストベース(XMLなし)のメッセージを処理します。私たちの目標はメッセージを検証することです。内容が正しければメッセージは有効です。メッセージのルールを表現するために、XMLで定義された独自の言語を開発しました。より複雑なルールを追加する必要があり、今度は他の代替案を検討して実際のルールエンジンを使用するときが来たと思います。これらのタイプのルールをサポートします。

  • 値のリストまたは正規表現の名前ex{SMITH、MOORE、A *}
  • メッセージに名前があります-
  • メッセージに名前がありません
  • if条件thenname= John else name = Jane 条件は単純であり、論理演算子が含まれていないことに注意してください。

これらのタイプのルールをサポートする必要があります。

  • if then elseしかし、条件に論理演算子が含まれている
  • for ...ループ:
    • メッセージ内のすべてのお客様には、米国から少なくとも1つ、フランスから少なくとも1つが必要です。
    • メッセージに含まれるすべての顧客に対して、米国からの顧客で、年間1000ドル以上を購入している顧客が少なくとも5人必要です。
    • Johnという名前の顧客の場合、姓はDoeである必要があります
  • John<15という名前の顧客の総数
  • 会社の名前は、メッセージ内の別の場所にある会社の名前と同じです。

ルールは、処理するメッセージの種類によって異なります。そのため、次のようないくつかの既存のソリューションを調査していました。

  • ジェス
  • OWL(整合性チェック)
  • Schematron(メッセージをXMLに変換することにより)

Javaで開発することを考えると、最良の選択肢は何でしょうか。考慮すべきもう1つのことは、エラーの説明、エラーの場所(行と列の番号)などのエラー報告を実行できる必要があるということです。

4

2 に答える 2

1

あなたはすでに正しい方向に進んでいるように私には聞こえます。私の提案は次のとおりです。

  1. パーサー/インタープリターを使用してテキストベースのメッセージを直接検査し、生成されたオブジェクトにルールを適用します。@Kdeveloperは、パーサー/インタープリターを生成するためのJavaCCを提案しました。これに、Javaでパーサー/インタープリター/トランスフォーマーを生成するための優れた環境であるANTLRv3を個人的に保証することで追加できます(他の言語の中でも)。そこから、Jessまたはその他のJavaルールエンジンを使用して、生成したオブジェクトを検証できます。ルールをパーサー/インタープリターに直接エンコードしてみることもできますが、これに反対し、代わりにルールを分離して、解析とセマンティック検証の手順を分離することを選択します。
  2. テキストベースのメッセージをXMLに変換してSchematronを適用することも実行可能なオプションですが、とにかくテキストメッセージを解析してXMLにする必要があります。このために、JavaCCまたはANTLRv3を検討し、XMLにマーシャリングできる事前定義されたオブジェクトモデル(W3C XMLスキーマからCastorまたはJAXBによって生成できるものなど)を設定することをお勧めします。そこから、結果のXMLにSchematronを適用できます。
  3. 私はあなたの提案の中で最もトリッキーなオプションをOWLに変換することを主張しますが、最も強力である可能性があります。まず、オントロジー用語(TBox)(クラス、プロパティなど)が必要になる場合があります。インスタンスデータ(ABox)をにマップします。そこから、整合性チェックはこれまでのところしか得られません。キャプチャしたいものとして概説した種類の制約の多くは、OWLで表現したり、DL-reasonerだけを使用して検証したりすることはできません。ただし、OWLオントロジーをSWRLルール(たとえば)と組み合わせると、概説したルールのタイプの多くをキャプチャーする可能性があります。SWRLで利用可能なルールとビルトインのタイプを見てくださいこれがあなたにとって十分に表現力があるかどうかを確認します。そうである場合は、 PelletHermiTなどのSWRLをサポートするDL-Reasonersを使用できます 。これらのようなOWL/SWRL推論システムの個々の実装は、多かれ少なかれW3C仕様を実装する可能性があるため、それぞれを調べて適用可能性を判断する必要があることに注意してください。
于 2010-09-29T00:03:48.560 に答える
0

ルールが静的である(つまり、コンパイル時に既知である)場合は、よく知られているJavaパーサージェネレーターであるJavaCCを使用してこれを作成できます。

于 2010-09-28T21:42:57.850 に答える