У меня есть три таблицы (на данный момент), одна с 2000 строками, а две другие - примерно с 1,6 миллиона строк каждая. У них есть столбцы, которые связывают их друг с другом, но они не являются формальными полями FK. Я написал программу на C ++ для создания файлов правил на основе исходных данных MySQL, например:
if T{ C1, C2...Cn } is the table definition
then the rule would be:
T(C1, C2, Cn).
Моя утилита преобразования оставляет целые числа развернутыми, а все остальное помещается в одинарные кавычки, поэтому INT (n), DECIMAL и т. Д. Становятся числами Пролога, а все остальное является атомом.
Тогда мой вопрос таков: если я хочу написать правило поиска для таблицы / правила с 26 полями, существует ли способ "мета-уровня" выразить это:
findStuffById(I,FieldIWant1,FieldIwant2etc) :-
tablename(_,_,I,_,FieldIWant1,_,_,_FieldIWant2etc,_,_,....).
Или мне нужно создать «более простые» правила, которые затем должны будут использовать «_» или переменные для захвата того, что я хочу?
Перспектива написания правил вроде ...
findThisById(X) :- tablename(X,_,_,_,_,This,_,_).
findThatById(X) :- tablename(X,_,_,That,_,_,_,_).
findTheOtherById(X) :- tablename(X,_,_,_,_,_,_,TheOther).
... до тошноты ... тревожит!
Пока я думал только о том, что мне может понадобиться создать составные термины в правилах, чтобы сгруппировать вещи вместе, то есть уменьшить количество переменных в правилах, но это, возможно, ограничит «свободу» будущего запроса? Я не специалист по Прологу; Я играл с ним несколько часов и очень хочу найти ему реальное применение в моей повседневной работе.
Я предполагаю, что моя программа преобразования может также кодировать, генерируя правила drudge, так что мне не придется вручную кодировать это. В больших таблицах 26 и 28 столбцов в каждой, так что вы можете видеть, к чему это идет!
Любые советы о том, как действовать, будут приветствоваться; У меня нет возможности использовать Prolog так много, как хотелось бы, и я всегда хочу узнать больше!
Я хочу создать веб-сервер SWI-Prolog, который будет сражаться лицом к лицу с сервером ElasticSearch, используя те же необработанные данные, чтобы узнать, какой из них быстрее всего отвечает на специальные запросы. Похоже, что ES не выполняет и традиционных соединений, если вы заранее не создаете составной документ со встроенными индексами, что также может быть в пользу использования Prolog.
Спасибо. Шон.