Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[134]

Сопоставитель, который используется в запросной системе, принимает на входе образец, структуру данных и кадр (frame), в котором указываются связывания для различных переменных образца. Он проверяет, соответствует ли структура данных образцу без противоречия со связываниями переменных, уже находящимися в кадре. Если да, то сопоставитель возвращает кадр, дополнив его связываниями, определенными во время сопоставления. Если нет, он указывает, что сопоставление неудачно.

Например, сопоставление образца (?x ?y ?x) со списком (aba) при пустом начальном кадре вернет кадр, в котором переменная ?x связана со значением a, а ?y со значением b. Попытка сопоставления того же списка с тем же образцом при начальном кадре, в котором указывается, что ?y связывается с a, окажется неудачной. Попытка сопоставления с теми же данными и образцом, при начальном кадре, в котором ?y связана со значением b, а ?x несвязана, вернет исходный кадр, дополненный связыванием a для ?x.

Сопоставитель - единственный механизм, необходимый для обработки простых образцов, не содержащих правил. Например, чтобы обработать запрос:

(должность ?x (компьютеры программист))

- мы просматриваем все утверждения в базе данных и выбираем те, которые соответствуют образцу при пустом начальном кадре. Для каждого найденного утверждения мы подставляем в образец значение ?x из кадра, полученного при сопоставлении.

Потоки кадров

Проверка образцов по отношению к кадрам организована посредством потоков. Получив кадр, процесс сопоставления просматривает элементы базы данных один за другим. Для каждого входа базы данных сопоставитель порождает либо специальный символ, указывающий, что сопоставление оказалось неудачным, либо расширение кадра. Из результатов сопоставления всей базы данных собирается поток, и этот поток пропускается через фильтр, отбрасывающий неудачи. Получается поток всех кадров, которые расширяют данный кадр за счет сопоставления с каким-либо утверждением из базы.67

В нашей системе запрос принимает входной поток кадров и для каждого кадра применяет вышеописанную операцию сопоставления, как показано на рис. 4.4. А именно, для каждого кадра во входном потоке запрос генерирует новый поток, содержащий все расширения этого кадра, порожденные сопоставлением с утверждениями из базы. Затем все эти потоки собираются в один громадный поток, который содержит все возможные расширения всех кадров входного потока. Этот поток и есть результат запроса.

Чтобы ответить на простой запрос, мы применяем его к потоку, который состоит из одного пустого кадра. Поток на выходе содержит все расширения

67Поскольку сопоставление - в общем случае весьма дорогая операция, нам хотелось бы избежать применения полного сопоставителя к каждому элементу базы данных. Обычное решение этой проблемы - разбить процесс на грубое (быстрое) сопоставление и окончательное сопоставление. Грубое сопоставление отфильтровывает базу и находит кандидатуры на окончательное сопоставление. Если действовать аккуратно, можно построить базу данных таким образом, что часть работы грубого сопоставителя проделывается при построении базы, а не в момент отбора кандидатов. Это называется индексированием (indexing) базы данных. Существует множество приемов и схем индексирования баз данных. Наша реализация, которую мы описываем разделе 4.4.4, содержит простейший вариант такой оптимизации.


кадров

запрос

отфильтрованный и расширенный

(job ?x ?y)

поток утверждений из базы данных

Рис. 4.4: Запрос обрабатывает поток кадров

входной поток кадров

выходной поток кадров

база данных

Рис. 4.5: Комбинация двух запросов через and осуществляется последовательной обработкой потока кадров.

пустого кадра (то есть, все ответы на наш запрос). Затем на основе этого потока кадров создается поток копий исходного образца запроса, в которых переменные конкретизированы значениями из всех кадров, и этот поток в конце концов печатается.

Составные запросы

Изящество реализации с потоками кадров по-настоящему проявляется при работе с составными запросами. При обработке составных запросов мы пользуемся тем, что наш сопоставитель умеет требовать, чтобы сопоставление не противоречило указанному кадру. Например, чтобы обработать and от двух запросов, скажем,

(and (может-замещать ?x (компьютеры программист стажер)) (должность ?person ?x))

(неформально, «найти всех сотрудников, способных выполнять работу программиста-стажера»), сначала мы находим все записи базы, отвечающие образцу

(может-замещать ?x (компьютеры программист стажер))

Получается поток кадров, каждый из которых содержит связывание для ?x. Затем для всех кадров этого потока мы находим записи, соответствующие образцу

(должность ?person ?x)


входной

поток

кадров

выходной

поток

кадров

база данных

Рис. 4.6: Комбинация двух запросов через or осуществляется лельной обработки потока кадров и слияния результатов.

путем парал-

таким образом, чтобы не менять уже известное связывание переменной ?x. Каждое новое сопоставление породит кадр, в котором будут содержаться связывания для ?x и ?person. And от двух запросов можно рассматривать как последовательное применение двух составляющих запросов, как показано на рис. 4.5. Кадры, прошедшие через первый запрос, фильтруются и расширяются вторым запросом.

На рисунке 4.6 показан аналогичный метод для вычисления or от двух запросов через параллельное выполнение двух составляющих запросов. Каждый запрос отдельно расширяет входной поток кадров. Затем два получившихся потока сливаются и образуют окончательный поток-результат.

Даже из этого высокоуровневого описания ясно, что обработка составных запросов может занимать много времени. Например, поскольку запрос может породить более одного выходного кадра для каждого входного, а каждый подзапрос в and принимает входные кадры от предыдущего подзапроса, в наихудшем случае число сопоставлений, которые должен произвести запрос and, растет экспоненциально с числом подзапросов (см. упражнение 4.76).68 Несмотря на то, что системы для обработки простых запросов вполне могут быть практически полезны, обработка сложных запросов чрезвычайно трудоемка.69

С точки зрения потока кадров, запрос not работает как фильтр, уничтожающий все кадры, для которых его подзапрос можно удовлетворить. Например, имея образец

(not (должность ?x (компьютеры программист)))

мы для каждого кадра во входном потоке пытаемся породить расширенные кадры, которые удовлетворяют образцу (должность ?x (компьютеры программист)) . Все кадры, для которых такие расширения существуют, мы изы-

68Впрочем, такой экспоненциальный взрыв в запросах and происходит редко, поскольку, как правило, дополнительные условия не увеличивают, а уменьшают число порождаемых кадров.

69Имеется обширная литература по системам управления базами данных, в которой основной темой является эффективная обработка сложных запросов.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196]