8

Я не могу найти указатель в правильном направлении, я даже не уверен, что это за термины, которые я должен исследовать, но бесчисленные часы работы в Google, кажется, крутят меня по кругу , поэтому, надеюсь, может помочь коллективный улей интеллекта Stack Overflow.Нужно руководствоваться ориентировочным логическим деревом логики

Проблема в этом, мне нужен способ фильтрации данных в том, что я могу назвать только составным логическим деревом. В настоящее время система реализует простую систему фильтрации И. Например, скажем, у нас есть набор данных людей. Вы добавляете множество фильтров, которые показывают всех людей, где (Пол = Женский) И (Возраст> 23) И (Возраст < 30) И (Статус = Одиночный). Достаточно легко, итерация по каждому элементу, добавление в действительную коллекцию предметов, только если каждое условие истинно.

Проблема, с которой я сталкиваюсь, заключается в том, как я могу обрабатывать пользователя, способного создавать сложные запросы, и есть и/или? Я думаю о чем-то вроде дерева, где каждый узел представляет и выражение оценивает его дочерние объекты на true или false. Простейшим примером будет: - отфильтровать до ((Пол == Мужской И Возраст == 25) ИЛИ (Пол == Женский И Статус == Одиночный)) И IQ> 120. Извините, я не могу придумать лучшего примера на момент. Но как вы собираетесь представлять этот тип дерева выражений и оценивать элементы в коллекции против этих фильтров. Какие ссылки помогут? Черт, каков какой-то проклятый поиск Google, который может привести к положительному направлению ?!

Спасибо всем, кто может оказать любую помощь.

Вот пример составного запроса в виде дерева с использованием набора данных людей

  • запросов - Покажите мне все человек, где секс является мужчиной и глаз зеленые или пол является женщиной, голубые глаза, или статус один. В форме Paren (Пол == Мужской & & Глаза == Зеленый) || (Пол == Женский & & (Eyes == Синий || Статус == Single))

Так в форме дерева им Думая

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 и рекурсирует.

Кажется, чтобы удовлетворить все концептуальные условия, которые я могу бросить на него, но с тех пор мы его реализуем. Я опубликую реальный код позже, когда его работа и фотографии помогут лучше описать эту проблему для других.

+0

Предлагаю вам разъяснить, в какой форме ваши данные: SQL db? Я предполагаю, что тег «as3» относится к ActionScript 3: если это так, вы действительно ищете специальные методы C# или AS3 или просто для «теории»? – BillW

+0

Данные хранятся в памяти, хотя технически реализация выполняется как в режиме flash, так и в silverlight, меня гораздо больше интересует понимание общего решения, чем конкретная реализация. Суть проблемы заключается в представлении пользовательского интерфейса пользователю, который позволяет им динамически создавать сложный запрос для фильтрации набора данных. Мне нужна надежная структура данных для представления запроса. До сих пор я следующий за узлом - Тип - А или А - поле - поле набора данных этот узел таргетирования - Работа - =, =,>, < <=, > = - Value - значение применить операцию против – JTtheGeek

+0

Более четкое объяснение! Я предлагаю вам уточнить, находится ли структура данных в C#/SilverLight: если это так, я бы предположил, что вы будете использовать Linq для выполнения «тяжелого подъема». Если вы уже на высоком уровне с Linq, используя lambdas, анонимные методы и т. Д., Это одно: если вы этого не сделаете, вы можете получить хороший совет по SO (если вы его попросите) в ресурсах изучения Linq (imho Jon Skeet «C# in Depth» - лучшая книга C# на планете с превосходным охватом Linq). Это может быть несовместимо с вашей идеей, но вы можете использовать словарь с «независимо» в качестве ключей и исполняемых (анонимных) методов в качестве значений. - BillW – BillW

ответ

1

Ваш синтаксический разбор выражения ((Пол == Мужской И Возраст == 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 
+0

Я вижу, что вы делаете, но я думаю, что внутреннее выражение (value-op-field, такое как IQ> 120) всегда может быть оценено на простое bool, поэтому, разлагая его вниз, вы получаете кучу bool внутри узлов для представления результата этого выражения узлов и группы And & Or на узлах, представляющих, как этот bool поглощается в результирующем дереве. Отмечая правильность, как сейчас, я считаю, что это лучший ответ. – JTtheGeek

+0

Не уверен, что я понимаю. Строго оценить() следует принять в качестве аргумента какой-то объект контекста (может быть, строку таблицы), что даст значение для поля (которое может быть различным для каждой строки). –

0

Должен сказать, что именно поэтому построены двигатели базы данных. Вы можете делать все, что вам нужно, с установленной логикой, и вы даже можете прийти к результату, который вы ищете, но тезисы являются стандартными проблемами, решаемыми базами данных и SQL. Вы также можете посмотреть linq для решения в коде.

+0

Я думаю, что он имеет в виду, как он может динамически строить это выражение в sql. – user29964

+0

Да, это о том, чтобы предоставить пользователю простой пользовательский интерфейс, который позволяет им легко создавать запрос. Я думаю, что я понял это с довольно простой древовидной структурой и несколькими простыми рекурсивными функциями, я знаю, что другие изучили эту проблему и хотели бы узнать их мысли и эксперименты, но пока не выяснили, как найти другие. Кроме того, в этом случае все данные хранятся в памяти. – JTtheGeek

+0

Возможна установка набора критериев и разрешение пользователю создать набор критериев и сохранить набор. Таким образом, набор 1 будет охватывать IQ> 120 Затем разрешите пользователям указывать несколько наборов для орлов. Это можно сделать графически интересным способом, позволяющим пользователям перетаскивать наборы. Возможно, вы могли бы размещать наборы внутри набора, чтобы создать пересечение или объединение множеств. Просто идея. Извините, я не понял суть вашего вопроса. – rerun

0

Похоже, вам нужно создать пользовательский интерфейс, который позволяет создавать простой синтаксический анализ. Когда пресса GO вы можете пройти дерево и создать дерево выражений LINQ из этой структуры пользовательского интерфейса. Выполните запрос LINQ, а затем обработайте результаты по мере необходимости. Поэтому я бы рекомендовал вам прочитать деревья выражений LINQ.

1

Эти виды запросов часто представляются как OR эд массив AND ред положений. То есть табличный формат, в котором вы читаете несколько условий, AND ed вместе, а затем читайте до 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 
1

Вы можете Google для таких терминов, как «исчисление предикатов» и «КНФ».

Смежные вопросы