Как хранить логические выражение в базе данных?

В общем проблема такая, я составляю схему БД для оболочки экспертных систем. Суть экспертной системы такая: у нее есть множество правил в виде продукций IF:... THEN:.... Я не могу составить схему для посылки правила, так как посылка может содержать сколь угодно вложенных конструкций. Например: IF: ((VAR1 > 7) AND (VAR2 < 10)) OR ... . Есть вот такой набросок, но он позволяет хранить правило лишь с двумя сравнениями, соединенными логически. А еще скобки могут менять порядок. Если провести связь саму в себя у сущности логическая операция, но тогда две логических операции так же должны быть связаны логически. В общем вот. Может кому приходилось сталкиваться с такого рода проблемой, или я занимаюсь абсолютной фигней и так никто не делает? Схема


Ответы (1 шт):

Автор решения: alexsteeel

Возможный алгоритм решения:

  1. Создать логическое выражение.
  2. Сериализовать его, например, в json.
  3. Записать сериализованное выражение в БД.
  4. Получить сериализованное выражение из БД.
  5. Десериализовать выражение.
  6. Использовать при вычислении.

В вопросе не указано, какой ЯП используется в самой системе. Вот пример для С# с использованием библиотеки Serialize.Linq:

using Serialize.Linq.Extensions;
using Serialize.Linq.Serializers;
using System.Linq.Expressions;

// Записали условие.
Expression<Func<int, int, bool>> expression =
    (x, y) => (x > 7 && x < 10) || y == 3;

// Сериализовали и записали в текстовом виде в БД.
string serializedExpression = expression.ToJson();

// Достали строку из БД, десериализовали и применили.
var serializer = new ExpressionSerializer(new JsonSerializer());
var deserializedExpression = serializer.DeserializeText(serializedExpression)
    as Expression<Func<int, int, bool>>;

if (deserializedExpression != null)
{
    var func = deserializedExpression.Compile();
    Console.WriteLine($"Результат для чисел 8 и 2: {func(8, 2)}");
    Console.WriteLine($"Результат для чисел 1 и 1: {func(1, 1)}");
}

Console.ReadKey();

При таком алгоритме предполагается, что количество и тип входных параметров известны при десериализации.

→ Ссылка