سؤال

لا أستطيع أن أجد مؤشر في الاتجاه الصحيح، وأنا لست متأكدا من أن الشروط التي يجب أن أبحث فيها ولكن لا تحصى ساعات من googling يبدو أن تدورني في دوائر، لذلك نأمل أن الغرابة الجماعية من الذكاء من كومة الفائض يمكن أن تساعد.

المشكلة هي هذا، أحتاج إلى طريقة لتصفية البيانات في ما يمكنني فقط استدعاء شجرة منطق مركب. حاليا النظام ينفذ نظام بسيط وتصفية. على سبيل المثال، دعنا نقول أن لدينا مجموعة بيانات من الناس. يمكنك إضافة مجموعة من المرشحات التي تظهر كل الأشخاص الذين هم (الجنس = أنثى) و (العمر> 23) و (العمر <30) و (الحالة = واحد). سهلة بما فيه الكفاية، تكرر من خلال كل عنصر، أضف إلى مجموعة عناصر صالحة فقط إذا كان كل حالة حقيقية.

المشكلة التي صادفها هي كيف يمكنني التعامل مع المستخدم القدرة على بناء استفسارات معقدة المعنية والتي وصالحة؟ أنا أفكر في شيء مثل شجرة حيث يمثل كل عقدة والتعبير تقييم أطفالها إلى صواب أو خطأ. مثال مبسط سيكون - تصفية لأسفل ((الجنس == الذكور والعمر == 25) أو (الجنس == أنثى وحالة == واحد)) و IQ> 120. آسف لا أستطيع التفكير في مثال أفضل في اللحظة. ولكن كيف تذهب حول تمثيل هذا النوع من شجرة التعبير، وتقييم العناصر في مجموعة ضد هذه المرشحات. ما هي بعض المراجع التي من شأنها أن تساعد؟ الجحيم، ما هي بعض عمليات البحث جوجل لعنة قد تؤدي إلى اتجاه إيجابي؟!

شكرا لأي شخص يمكن أن يقدم أي مساعدة.

إليك مثال على استعلام مجمع في نموذج شجرة باستخدام مجموعة بيانات من الناس

  • الاستعلام - أرني جميع الناس حيث الجنس من الذكور والعيون خضراء أو جنسية أنثى، أو عيون تكون أزرق، أو حالة واحدة. في شكل تبين (الجنس == ذكر & عيون == أخضر) || (الجنس == أنثى && (عيون == الأزرق || الحالة == واحد))

لذلك في شكل شجرة أنا أفكر

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
}

لذلك للحصول على عقدة معينة، قم بتقييم Chilren، إذا كنت وعقدة، فارجع True إذا كان تعبيرك ينتج عنه صحيح ويقيم كل ما تبذلونه من الأطفال الذين يقومون بتقييم True أو أي طفل أو طفل.

يبدو أنه يرضي كل حالة مفاهيمية يمكنني رميها فيه، لكننا سنقوم بذلك بمجرد تنفيذها. سأقوم بنشر الكود الحقيقي في وقت لاحق عند عملها وصورها للمساعدة في وصف هذه المشكلة بشكل أفضل للآخرين.

هل كانت مفيدة؟

المحلول

تحليلك للتعبير ((الجنس == الذكور والعمر == 25) أو (الجنس == = أنثى وحالة == واحد)) و IQ> 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

نصائح أخرى

غالبا ما يتم تقديم هذه الأنواع من الاستفسارات ك ORصفيف إد ANDed clauses. وهذا هو، وهو تنسيق جدولي تقرأه عبر شروط متعددة 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 

قد ترغب في جوجل للحصول على مصطلحات مثل "حساب التفاضل والتكامل المسند" و "النموذج الطبيعي الملتحمة".

يجب أن أقول أن هذا هو السبب في أن محركات قاعدة البيانات مبنية. يمكنك أن تفعل كل ما تحتاجه مع المنطق المحدد وقد تصل إلى النتيجة التي تبحث عنها، لكن الأطروحات هي مشاكل قياسية حلها بواسطة قواعد البيانات و SQL. يمكنك أيضا إلقاء نظرة على LinQ لحل الرمز.

يبدو أنك بحاجة إلى إنشاء واجهة مستخدم تسمح بإنشاء شجرة تحليل بسيطة. عندما تذهب المكابس، يمكنك بعد ذلك المشي الشجرة وإنشاء شجرة تعبير LinQ من هيكل واجهة المستخدم هذا. تنفيذ استعلام LINQ ثم معالجة النتائج حسب الحاجة. لذلك أود أن أوصي بقراءة أشجار التعبير LINQ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top