orientação necessidade para a árvore lógica booleana avaliativo
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.
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 OR
ed de cláusulas AND
ed. Isto é, um formato tabular em que você lê em várias condições AND
ed 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.