Чудесно, когда есть описание таблиц и полей в базе. Тогда можно составить SQL-builder на основе запроса на естественном языке.
Каким должно быть описание
Описание должно для каждой интересующей колонки в БД иметь таблицу справочных значений, что у неё идентификатор для связи и в каких таблицах, собственно понятное имя, если надо — соответствующее поле даты, и… да для начала достаточно.
Тогда такое метаописание позволяет конструировать на лету запросы вида выбери ЧТО из ОТКУДА_ДЛЯ_ЧТО где ЧТО = ЗНАЧЕНИЕ сортируй по ДАТЕ_ЧТО
— ну и в таком духе.
Связи решают всё
Справочники понятно как связывать (просто брать и всегда связывать если задали значение). А вот если это через 33 таблицы надо связать, то всю эту структуру описательную логично укладывать в граф — и кратчайшим путем объединять таблицы.
Это работает.
Намерение и именованные сущности
Для понимания, что же нужно выбрать можно (и нужно) извлекать именованные сущности из текста запроса. Само намерение обычно select
. Но могут быть и другие — связанные с визуализацией например (хотя её лучше выбирать автоматически исходя из формы ответа).
А точно работает?
Работает. И у дашбордов Visiology в частности есть подобный бот. Но появился он позже, чем я это придумал 🙂 Не суть — чат с данными придумали еще до этой идеи (французы Aristotle — но у них так и не взлетел стартап).
Это не работает, если запрос сильно отличается от естественного текста (как ни странно). Свои термины, сокращения, иногда невозможность отличить наименование сущности от её значений… черт в деталях как обычно. Да и метабазу набить бывает непросто (не всё Chinook).
Но кому что-то такое нужно — тому нужно пробовать обязательно. Легко не будет, но магический эффект гарантирован.
P.S. На графовых базах навроде Neo4j всё из коробки должно быть в разы легче, но я не пробовал (а вы попробуйте — затолкать туда обычные данные).