Логические языки запросов

advertisement
Логические языки запросов.
Мотивировка:
1. Логические правила расширяются более естественно, чем
реляционная алгебра, на рекурсивные запросы, которые
невозможны в обычном SQL.
 Используются в рекурсивном SQL.
2. Логические правила формируют основу для многих
интегрированных информационных систем и приложений.
Пример на языке логических запросов Datalog.
Likes(drinker, beer)
Sells(bar, beer, price)
Frequents(drinker, bar)
Happy(d) <Frequents(d,bar) AND
Likes(d,beer) AND
Sells(bar,beer,p)
 Это - правило.
 Левая часть - заголовок правила.
 Правая часть – тело правило (цель) = логическое
произведение(AND) подцелей.
 Заголовок правила и подцели являются атомами.
 Атом = предикат с аргументами
 Предикат = имя отношения или арифметический предикат,
например ‘<’, ’>’ и т.д.
 Аргументами могут быть переменные или константы
 Подцели (но не заголовок) могут иметь перед собой отрицание
Содержательный смысл правил.
Заголовок имеет значение «истина» для своих аргументов, если
существуют значения локальных переменных (в теле правила, но
не в заголовке), для которых все подцели будут иметь значение
«истина».
 Если в теле нет отрицаний и арифметических сравнений, то
заголовок правила может рассматриваться как проекция
соединения подцелей на множество аттрибутов заголовка.
Пример.
Вышеприведенное правило эквивааалентно
Happy(d) =  drinker (Frequents
Likes
Sells)
Исчисление правил (высказываний).
Два двойственных подхода:
1. Основан на переменных: Рассмотреть всевозможные
комбинации значений переменных. Если все подцели
обращаются в «истину» - добавить заголовок к отношению
результата.
2. Основан на кортежах: Рассмотреть всевозможные назначения
кортежей подцелям, делающие все подцели «истиной». Если
при этом значения котртежей совместимы(соединимы) –
добаыить заголовок к результату.
Пример. Назначение переменных
S(x,y) <- R(x,z) AND R(z,y) AND NOT R(x,y)
A
B
1
2
2
3
R =
 Назначения, обращаюшие в «истину» первую подцель:
1. x -> 1, z -> 2.
2. x -> 2, z -> 3.
 В случае (1), y -> 3 обращает вторую подцель в «истину»,
поскольку (1; 3) не принадлежит R, третья подцель – также
обрашается в «истину».
 Следовательно, добавляем (x; y) =(1; 3) к отношению S.
 В случае (2), никакие значения “y” не обращают в “истину»
вторую подцель.
Следовательно,
A
B
1
3
S=
Пример. Тот же пример с назначением кортежей.
Начнем с подцелей не имеющих перед собой отрицания
 Четыре возможных назначения кортежей подцелям:
R(x; z) R(z; y)
(1; 2)
(1; 2)
(2; 3)
(2; 3)
(1; 2)
(2; 3)
(1; 2)
(2; 3)
 Только второе из них дает для z совместимое значение.
 Оно также бращает в «истину» третью подцель NOT R(x,y).
 Следовательно, единственный кортеж для заголовка - (1; 3).
Безопасность(Safety).
Правило может быть бессмысленным если переменные
используются в произвольном виде.
Примеры.
 S(x) <- R(y),
 S(x) <- NOT R(x),
 S(x) <- R(y) AND x < y.
В каждом из этих случаев, результат бесконечен, даже если
отношение R конечно.
 Для того, чтобы переменная ‘x’ имела смысл для операций с
базой данных, потребуем, чтобы выполнялось условие
(условие безопасности). Если ‘x’ появляется в одном из
элементов правила:
1. Заголовке,
2. Отрицаемой подцели (подцели с предшествующим NOT)
3. Арифметическом сравнении,
то ‘x’ должна также присутствовать в неотрицаемой
обычной(в виде отношения) подцели в теле правилаю
 В дальнейшем будем требовать, чтобы правила были
безопасными.
Программы на Datalog.
 Множество правил задают программу на Datalog.
 Предикаты/отношения делятся на два класса:
 Экстенсиональная база данных, ЭБД, = отношения,
хранимые в базе данных.
 Интенсиональная БД , ИБД = отношения, определенные при
помощи одного или нескольких правил.
 Предикат может быть либо ЭБД, либо ИБД, но не
одновременно
 ИБД предикат может появиться в теле или заголовке
правила, ЭБД – только в теле.
Пример.
Преобразовать следующее SQL предложение (найти
производителей сортов пива, продаваемых Joe):
Beers(name, manf)
Sells(bar, beer, price)
SELECT manf
FROM Beers
WHERE name IN ( SELECT beer
FROM Sells
WHERE bar = 'Joe''s Bar'
);
в программу на Datalog.
JoeSells(b) <- Sells('Joe''s Bar', b, p)
Answer(m) <- JoeSells(b) AND Beers(b,m)
 Замечание: Beers, Sells - ЭДБ; JoeSells, Answer - ИДБ.
Выразительная мошность Datalog.
 Нерекурсивный Datalog подобен (классической) реляционной
алгебре.
 Подробнее см. в книге.
 Datalog имеет те же фозможности, как SQL оператор selectfrom-where без аггрегирования и группирования
 Рекурсивный Datalog может использовать запросы, которые не
могут быть выражены в стандартном SQL.
 Но ни один из этих языков является полным в выразительном
смысле (полнота по Тьюрингу - Turing completeness).
Рекурсия.
 ИБД предикат P завасит от предиката Q, если имеется правило
с P в заголовке и Q в подцели.
 Нарисуем граф с вершинами – ИБД предикатами, дуга P -> Q
означает, что P зависит от Q.
 Программа рекурсивна тогда и только тогда когда граф имеет
циклы.
Рекурсивный пример.
Sib(x,y)
<- Par(x,p) AND Par(y,p) ANDx <> y
Cousin(x,y) <- Sib(x,y)
Cousin(x,y) <- Par(x,xp) AND Par(y,yp) AND Cousin(xp,yp)
Исчисление рекурсивных правил.
Start
ИБД = O
Применить
правила к
ЭБД, ИБД
да
Измен. в
ИБД?
нет
конец
Пример.
ЭБД Par =
a
d
b
f
j
c
g
e
h
k
i
 Замечание. В силу симметрии Sib и Cousin факты
присутствуют парами, поэтому будем упоминать (x; y),
подразумевая (x; y) и (y; x).
Начальное
состояние
Sib
Cousin
О
О
Добавлено
(b; c), (c; e)
после шага 1: (g; h), (j; k)
О
Добаслено
после шага 2:
(b; c); (c; e)
(g; h); (j; k)
Добавлено
после шага 3:
(f; g); (f; h)
(g; i); (h; i) (i; k)
Добавлено
после шага 4:
(k; k)
(i; j)
Стратифицированное отрицание.
 Отрицание, заключенное внутрь рекурсии, не имеет смысла.
 Даже когда отрицание и рекурсия разделены, возможна
неясность относительно смысла правил, и какое-либо одно
трактование должно быть выбрано.
 Стратифицированное отрицание является дополнительным
ограничением на рекурсивные правила (подобно
«безопасности»), которое решает обе проблемы:
1. Оно не позволяет отрицание внутри рекурсии.
2. Когда отрицание отделено от рекурсии, оно выражает
интуитивно правильный смысл правила
(стратифицированная модель).
Проблема рекурсивного отрицания.
Рассмотрим:
P(x) <- Q(x) AND NOT P(x)
 Q = EDB = {1; 2}.
 Вычислить ИБД P итеративно?
 Инициализация, P = О.
 Шаг 1: P = {1; 2}.
 Шаг 2: P = O, и т.д.
Страты.
Интуитивный смысл страты ИБД предиката = максимальное
число отрицаний, через которое вы можете пройти по дороге к
ЭБД предикату.
 Должно равняться 1 в «стратифицированных» правилах.
 Определим граф, определяющий страты:
 Вершины графа = ИБД предикаты.
 Дуга P -> Q, если Q присутствует в теле правила с
заголовком P.
 Отметим эту дугу знаком ‘-‘, если Q стоит в подцели с
отрицанием.
P (x) <- Q(x) AND NOT P(x)
P
_
Пример. Какие вершины из множества целей не достижимы ни с
какой исходной вершины.
Reach(x) <- Source(x)
Reach(x) <- Reach(y) AND Arc(y,x)
NoReach(x) <- Target(x) AND NOT Reach(x)
NoReach
Reach
Вычисление страт.
Страта ИБД предиката А = максимальное число, отмеченных ‘-‘
на любом пути ведущем из А.
Примеры.
 Для первого примера страта предиката Р = оо
 Для второго примера страта Reach =0, страта NoReach=1.
Стратифицированное отрицание.
Datalog программа с рекурсией и отрицанием является
стратифицированной, если каждый ИБД предикат имеет
конечную страту.
Стратифицированная модель.
Если Datalog программа стратифицирована, мы можем
вычислить отношения для ИБД предикатов по фозрастанию
страт, начиная с самой маленькой.
Пример.
Reach(x) <- Source(x)
Reach(x) <- Reach(y) AND Arc(y,x)
NoReach(x) <- Target(x) AND NOT Reach(x)
 ЭБД:
 Source = {1}.
 Arc = {(1; 2); (3; 4); (4; 3)}.
 Target = {2; 3}.
1
source
2
target
3
target
4
 Сначала вычисляем Reach = {1; 2} (страта 0).
 Затем - NoReach = {3}.
Явлется ли стратифицированное решение очевидным?
На самом деле - нет.
 Имеется другая модлеь, обращающая правила в «истину»
независимо от того, какие значения будут подставлены для
переменных: Reach = {1; 2; 3; 4}, NoReach = O.
 Единственный способ обратить Datalog правило в «ложь», это
когда тело имеет значение «истина», а заголовок – «ложь».
 Для этой модели заголовки правил для Reach «истинны» для
всех значений, что обеспечивает в правиле для NoReach
значение «ложь» для подцели NOT Reach(x) и всего тела
правила. Следовательно, все правило NoReach – «истинно».
Download