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