Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
pl:miw:2009:piw09_des [2009/09/08 21:50]
piw09
pl:miw:2009:piw09_des [2009/09/10 11:07]
piw09
Linia 397: Linia 397:
  
 {{:​pl:​miw:​2009:​4_4_3.png|}} {{:​pl:​miw:​2009:​4_4_3.png|}}
 +
 +=== 4.5. Relacje ===
 +
 +Zanalizujmy bardziej złożony przykład, pokazujący jak imitować polecenia SQL za pomocą Datalogu. Będzie to 
 +
 +przyklad testujący możliwości DES pod kątem współdziałania różnego rodzaju języków, oraz tego, czy faktycznie ​
 +
 +można je stosować mniej więcej wymiennie.
 +
 +Przedstawmy polecenia SQL razem z analogami w Datalogu:
 +
 +== Tworzenie tabel i wstawianie wartości ==
 +
 +<​code>​% Najpierw tworzymy tabele
 +create or replace table a(a);
 +create or replace table b(b);
 +create or replace table c(a,b);
 +
 +% Listujemy powyższe zależności
 +/dbschema
 +
 +% Dodajemy rekordy do tabeli
 +insert into a values ('​a1'​);​
 +insert into a values ('​a2'​);​
 +insert into a values ('​a3'​);​
 +insert into b values ('​b1'​);​
 +insert into b values ('​b2'​);​
 +insert into b values ('​a1'​);​
 +insert into c values ('​a1','​b2'​);​
 +insert into c values ('​a1','​a1'​);​
 +insert into c values ('​a2','​b2'​);</​code>​
 +
 +Odpowiednik w Datalogu, łączący tworzenie tabel oraz wstawianie rekordów:
 +
 +<​code>​a(a1).
 +a(a2).
 +a(a3).
 +
 +b(b1).
 +b(b2).
 +b(a1).
 +
 +c(a1,b2).
 +c(a1,a1).
 +c(a2,​b2).</​code>​
 +
 +== Projekcja ==
 +
 +Kod SQL:
 +
 +<​code>​
 +% Testujemy operację projekcji
 +select a from c;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​projection(X) :- c(X,​Y).</​code>​
 +
 +== Selekcja z kryterium ==
 +
 +Kod SQL:
 +
 +<​code>​% Selekcja z pewnym kryterium
 +select a from a where a='​a2';</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​selection(X) :- a(X), X=a2.</​code>​
 +
 +== Iloczyn kartezjański ==
 +
 +Kod SQL:
 +
 +<​code>​% Iloczyn kartezjański
 +select * from a,​b;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​cartesian(X,​Y) :- a(X), b(Y).</​code>​
 +
 +== Inner Join ==
 +
 +Kod SQL:
 +
 +<​code>​% złączenie typu inner join
 +select a from a inner join b on a.a=b.b;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​inner_join(X) :- a(X), b(X).</​code>​
 +
 +== Left Join ==
 +
 +Kod SQL:
 +
 +<​code>​% złączenie typu left join
 +select * from a left join b on a.a=b.b;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​left_join(X,​Y) :- lj(a(X), b(Y), X=Y).</​code>​
 +
 +== Right Join==
 +
 +Kod SQL:
 +
 +<​code>​% złączenie typu right join
 +select * from a right join b on a.a=b.b;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​right_join(X,​Y) :- rj(a(X), b(Y), X=Y).</​code>​
 +
 +== Full join ==
 +
 +Kod SQL:
 +
 +<​code>​% złączenie typu full foin
 +select * from a full join b on a.a=b.b;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​full_join(X,​Y) :- fj(a(X), b(Y), X=Y).</​code>​
 +
 +== Union ==
 +
 +Kod SQL:
 +
 +<​code>​% złączenie typu unia
 +select * from a union select * from b;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​union(X) :- a(X) ; b(X).</​code>​
 +
 +== Różnica ==
 +
 +Kod SQL:
 +
 +<​code>​% Testujemy operację select z kryterium różnicy
 +select * from a except select * from b;</​code>​
 +
 +Kod Datalog:
 +
 +<​code>​difference(X) :- a(X), not(b(X)).</​code>​
 +
 +== Relacje w Datalog i SQL ==
 +
 +Ważnym aspektem systemu DES jest fakt, iż mimo że polecenia w SQL i Datalog można stosowac wymiennie i przeplatać ​
 +
 +je ze sobą, to jednak relacji utworzonych w Datalog nie można używać od razu jako tabeli w SQL.
 +
 +Przyjrzyjm się powyższemu kodowi. Załóżmy, że utworzyliśmy w Datalogu relacje:
 +
 +<​code>​a(a1).
 +a(a2).
 +a(a3)</​code>​
 +
 +Nie możemy po prostu użyć jej w SQL za pomocą, np., polecenia:
 +
 +<​code>/​sql select * from a;</​code>​
 +
 +**Musimy WPIERW utworzyć analogiczną tabelę w SQL:**
 +
 +<​code>/​sql
 +create table a(a)</​code>​
 +
 +I dopiero teraz spróbować powyższej operacji. Całość obrazuje poniższy przykład.
 +
 +Zakładamy, że wczytaliśmy już całość powyższego kodu do systemu DES.
 +
 +{{:​pl:​miw:​2009:​4_5_1.png|}}
  
 ===== 5. Wnioski końcowe ===== ===== 5. Wnioski końcowe =====
pl/miw/2009/piw09_des.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0