8

私は正しい方向へのポインターを見つけることができないようです、私は私が研究すべき用語が何であるかさえわかりませんが、数え切れないほどのグーグルが私を輪になって回しているようです、それでうまくいけばスタックの知性の集合的なハイブオーバーフローが役立ちます。

問題はこれです。複合論理ツリーとしか呼べないデータをフィルタリングする方法が必要です。現在、システムは単純なANDフィルタリングシステムを実装しています。たとえば、人のデータセットがあるとします。(Sex = Female)AND(Age> 23)AND(Age <30)AND(Status = Single)のすべての人を表示するように一連のフィルターを追加します。非常に簡単で、各アイテムを繰り返し処理し、すべての条件が真である場合にのみ有効なアイテムコレクションに追加します。

私が直面している問題は、関連する複雑なクエリを作成できるユーザーをどのように処理するかということです。私は、各ノードがその子を真または偽に評価する式を表すツリーのようなものを考えています。単純な例は次のようになります-((Sex == Male AND Age == 25)OR(Sex == Female AND St​​atus == Single))AND IQ>120にフィルターします。申し訳ありませんが、でより良い例を考えることはできません。瞬間。しかし、このタイプの式ツリーをどのように表現し、これらのフィルターに対してコレクション内のアイテムを評価するのでしょうか。役立つ参考資料は何ですか?地獄、ポジティブな方向につながるかもしれないいくつかの気の利いたグーグル検索は何ですか?!

助けてくれる人に感謝します。

これは、人々のデータセットを使用したツリー形式の複合クエリの例です。

  • クエリ-性別が男性で目が緑色、性別が女性、目が青色、またはステータスが単一のすべての人を表示します。パレン形式(性別==男性&&目==緑)|| (性別==女性&&(目==青||ステータス==シングル))

だから木の形でimThinking

o-Root Node
  - And - Sex = Male
     - And - Eyes = Blue
  - Or - Sex = Female
     - And Eyes = Blue
     - Or Status = Single

解決策は、次のようなデータ構造で各ノードを表すことだと思います

Node
{
   OpType - AND or OR
   ExpressionField - The field to evaluate
   ExpressionOp -   =, !=, >, >=, <, <=
   ExpressionValue - the value to compare the field's value against

   Function Evaluate() - returns a bool
}

したがって、特定のノードについて、ANDノードの場合は子を評価し、式がtrueになり、すべてのAND子がtrueと評価されるか、OR子がtrueと評価されて再帰する場合は、trueを返します。

私が投げることができるすべての概念的な条件を満たすようですが、それ以来、私はそれを実装します。この問題を他の人にとってよりよく説明するのに役立つように、実際のコードとその動作および写真を後で投稿します。

4

5 に答える 5

1

式の解析((Sex == Male AND Age == 25)OR(Sex == Female AND St​​atus == Single))ANDIQ>120は奇妙に見えます。私はそれを次のように解析します:

* And
    * Or
        * And
            * ==
                * Sex
                * Male
            * ==
                * Eyes
                * Blue
        * And
            * ==
                * Sex
                * Female
            * ==
                * Status
                * Single
    * >
        * IQ
        * 120

ツリータイプは次のようになります:

Node
{
    bool evaluate ()
}

AndNode : Node
{
    Node left
    Node right

    bool evaluate ()
    {
        return left.evaluate () && right.evaluate ()
    }
}

// OrNode is similar

EqualsNode : Node
{
    Field field
    Value value

    bool evaluate ()
    {
        return field.value () == value
    }
}

// Likewise for <, >, etc
于 2009-12-04T12:40:03.387 に答える
1

これらの種類のクエリは、多くの場合、 ed句のORed配列として表示されます。ANDつまり、複数の条件をAND一緒に読んでから、ORそれらを読み上げる表形式です。これは条件の繰り返しにつながりますが、ユーザーが読み取り、書き込み、および理解するのは簡単です。サンプル((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120は次のようになります

Sex == Male   & Age == 25        & IQ > 120 
Sex == Female & Status == Single & IQ > 120 
于 2009-12-04T17:55:56.243 に答える
1

「述語論理」や「連言標準形」などの用語については、Googleを使用することをお勧めします。

于 2009-12-05T14:16:27.267 に答える
0

これがデータベースエンジンが構築されている理由であると言わざるを得ません。セットロジックを使用して必要なすべてを実行でき、探している結果に到達することもありますが、これらはデータベースとSQLによって解決される標準的な問題です。linqでコード内ソリューションを探すこともできます。

于 2009-12-02T06:26:27.020 に答える
0

単純な解析ツリーを作成できるユーザーインターフェイスを作成する必要があるようです。GOを押すと、ツリーをたどり、そのユーザーインターフェイス構造からLINQ式ツリーを作成できます。LINQクエリを実行し、必要に応じて結果を処理します。したがって、LINQ式ツリーを読むことをお勧めします。

于 2009-12-04T04:13:57.460 に答える