Pergunta

Eu não consigo encontrar um ponteiro na direção certa, não estou mesmo certo que os termos são de que eu deveria estar pesquisando, mas incontáveis ??horas de googling parecem estar me girando em círculos, por isso espero que a colmeia coletivo de inteligência de estouro de pilha pode ajudar.

O problema é este, eu preciso de uma maneira de filtrar dados em que só posso chamar uma árvore lógica composto. Atualmente, o sistema implementa um simples e filtragem de sistema. Por exemplo, vamos dizer que temos um conjunto de dados de pessoas. Você pode adicionar um monte de filtros tais que mostram todas as pessoas onde (Sex = feminino) e (Idade> 23) e (Idade <30) e (Status = Individual). Fácil, iterate através de cada item, adicionar a uma coleção itens válida somente se todas as condições é verdadeira.

O problema que eu estou encontrando é como faço para lidar com o usuário ser capaz de construir consultas complexas envolvidas e de e ou de? Estou pensando em algo como uma árvore onde cada nó representa e expressão avaliando suas crianças a verdadeira ou falsa. Um exemplo simplista seria - filtro para baixo para ((Sex == masculino e idade == 25) ou (Sex == Feminino e status == Individual)) e QI> 120 Desculpe, não posso pensar em um melhor exemplo na o momento. Mas como você iria sobre o que representa este tipo de árvore de expressão, e avaliar os itens em uma coleção contra esses filtros. Quais são algumas das referências que poderiam ajudar? Inferno, que são algumas maldita Google busca que pode levar a uma direção positiva?!

Graças a alguém que pode fornecer qualquer ajuda.

Aqui está um exemplo de uma consulta composto na forma de árvore usando um conjunto de dados de pessoas

  • Consulta - Mostre-me todas as pessoas onde o sexo é masculino e olhos são verdes ou sexo é feminino, os olhos são azuis, ou o estado é único. Na forma Paren (Sexo == masculinos && Olhos == verde) || (Sex == Feminino && (Olhos == azul || Estado == Individual))

Assim Na árvore de forma im Pensamento

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

Eu acredito que a solução é representar cada nó como em uma estrutura de dados como

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
}

Assim, para um dado nó, avaliar os chilren, se você for um E nó, em seguida, retornar true se a sua expressão resulta em verdade e todos os seus e crianças avaliadas como verdadeiras ou qualquer ou a criança é avaliada como verdadeira e recurse-se.

parece satisfazer todas as condições conceitual posso jogar nele, mas vamos desde quando eu implementá-lo. Vou postar o código real, mais tarde, quando o seu trabalho e as imagens para ajudar a descrever este problema melhor para os outros.

Foi útil?

Solução

A sua análise da expressão ((Sex == masculino e idade == 25) ou (Sex == Feminino e status == Individual)) e QI> 120 parece estranho. Eu iria analisá-lo como:

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

O tipo de árvore seria:

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

Outras dicas

Esses tipos de consultas são frequentemente apresentados como uma matriz ORed de cláusulas ANDed. Isto é, um formato tabular em que você lê em várias condições ANDed juntos, e em seguida, ler até OR eles. Isso leva a alguma repetição de condições, mas é fácil para os usuários a ler, escrever e compreender. Seu ((Sex == Male AND Age == 25) OR (Sex == Female AND Status == Single)) AND IQ > 120 amostra seria semelhante

Sex == Male   & Age == 25        & IQ > 120 
Sex == Female & Status == Single & IQ > 120 

Você pode querer Google para termos como 'cálculo de predicados' e 'conjuntivo forma normal'.

Eu tenho que dizer que é por isso que os motores de banco de dados são construídos. Você pode fazer tudo o que necessita com a lógica de conjunto e você pode até chegar ao resultado que você está procurando, mas teses são problemas padrão resolvido por bancos de dados e SQL. Você também pode olhar para LINQ para uma solução em código.

Parece que você precisa para criar uma interface que permite a criação de uma árvore de análise simples. Quando as prensas GO você pode então percorrer a árvore e criar uma árvore de expressão LINQ dessa estrutura interface do usuário. Executar a consulta LINQ e depois processar os resultados, conforme necessário. Gostaria, portanto, recomendo que você leia-se em árvores de expressão LINQ.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top