RĪGAS TEHNISKĀ UNIVERSITĀTE - Datu bāzes tehnoloģijas€¦ · Web viewDati, fakti, likumi un...
-
Upload
truongtram -
Category
Documents
-
view
220 -
download
0
Transcript of RĪGAS TEHNISKĀ UNIVERSITĀTE - Datu bāzes tehnoloģijas€¦ · Web viewDati, fakti, likumi un...
Dati, fakti, likumi un vaicājumi
Dati: Jānis, Jūlijs, 75, sieviete
Fakti: Jūlijs ir Jāņa vecāks vecāki( Jūlijs, Jānis)
Jānis ir 40 gadus vecs vīrietis persona(Jānis, 40, vīrietis)
Likumi: māte( X, Y) : - persona( X, , sieviete), vecāki( X, Y).
Vaicājumus var pierakstīt sekojoši:? - vecāki(Inese, X). Kam vecāks ir Inese? Atbilde Liene un Zane
? - vecāki( Y , Jānis). Kas ir Jāņa vecāki? Atbilde Jūlijs un Anita
? - vecāki( Y, Jānis), persona( Y, , sieviete). Kāda sieviete ir Jāņa vecāks?
Atbilde Anita
? - māte( Y, Jānis). Kas ir Jāņa māte? Atbilde Anita
Tabula VecākiTēva vai
mātes vārds(VEC)
Bērna vārds(BER)
Jūlijs JānisJūlijs RasmaAnita JānisAnita RasmaJānis LieneJānis ZaneInese ZaneInese LieneMonvīds IneseAnna Inese
Tabula PersonasVārds(VAR)
Vecums(GADI)
Dzimums(DZIM)
Jūlijs 75 vīrietisAnita 70 sievieteJānis 40 vīrietisRasma 50 sievieteInese 30 sievieteLiene 5 sievieteZane 3 sievieteMonvīds 60 vīrietisAnna 60 sieviete
Faktu un likumu bāze
Predikāti - fakti
dzimums(X, Y) dzimums(Anita, sieviete) dzimums(Jānis, vīrietis)
vecāks(X, Y) vecāks(Jānis, Zane) vecāks(Inese, Zane)
Predikāti - likumi
māte(M,X): vecāks(M,X), dzimums(M, sieviete)
tēvs(T,X): vecāks(T,X), dzimums(T, vīrietis)
dēls(D,X): vecāks(X,D), dzimums(D, vīrietis)
meita(M, X): vecāks(X,M), dzimums(M, sieviete)
brālis(B,X): māte(M, B), māte(M,X), tēvs(T, B), tēvs(T, X), dzimums(B, vīrietis)
māsa(S,X): māte(M, S), māte(M,X), tēvs(T, S), tēvs(T, X), dzimums(S, sieviete)
vecmamma(V, X): vecāks(V, Y), vecāks(Y, X), dzimums(V, sieviete)
vecpaps(V, X): vecāks(V, Y), vecāks(Y, X), dzimums(V, vīrietis)
2
Rekursija predikātu likumos
vecvecāks(VV, X): vecāks(VV, Y), vecāks(Y, X)
vecvecvecāks(VVV, X): vecāks(VVV, VV), vecāks(VV, V), vecāks(V, X)
sencis (S, X): vecāks (S, X) Vecāku iegūšana
sencis (S, X): vecāks (V, X), vecāks (S, V) Vec-vecāki
sencis (S, X): vecāks (V, X), vecāks (VV, V), vecāks (S, VV) Vec-vec-vecāki
Likums izmantojot rekursiju:
sencis(S, X): vecāks(S, X)
sencis(S, X): sencis(Z, X), vecāks(S, Z)
3
Sākotnējie fakti
Jauniegūtiefakti
Piemērs deduktīvās datu bāzes veidošanai
Vaicājums: brālis(B, Rasma)
Vai ir fakti brālis(X, Y)? nav Vai ir likums brālis(X, Y)?
Likums: brālis(X, Y): māte(M, X), māte(M,Y), tēvs(T, X), tēvs(T, Y), dzimums(X, vīrietis)brālis(B, Rasma): māte(M, B), māte(M, Rasma), tēvs(T, B), tēvs(T, Rasma), dzimums(B, vīrietis)
Vai ir fakti māte(X,Y)? nav Vai ir likums māte(X,Y)?Likums: māte(X,Y): vecāks(X,Y), dzimums(X, sieviete)māte(M, B): vecāks(M, B), dzimums(M, sieviete)
Vai ir fakti māte(X,Y)? nav Vai ir likums māte(X,Y)?Likums: māte(X,Y): vecāks(X,Y), dzimums(X, sieviete)māte(M, Rasma): vecāks(M, Rasma), dzimums(M, sieviete)
Vai ir fakti tēvs(X,Y)? nav Vai ir likums tēvs(X,Y)?Likums: tēvs(X,Y): vecāks(X,Y), dzimums(X, vīrietis)tēvs(T, B): vecāks(T, B), dzimums(T, vīrietis)
Vai ir fakti tēvs(X,Y)? nav Vai ir likums tēvs(X,Y)?Likums: tēvs(X,Y): vecāks(X,Y), dzimums(X, vīrietis)tēvs(T, Rasma): vecāks(T, Rasma), dzimums(T, vīrietis)
Vai ir fakti dzimums(X,Y)? Jā Fakti: dzimums(X,Y)dzimums(B, vīrietis)
4
Likumu un faktu predikātu pakārtotības koks
brālis(B, Rasma)
māte(M, B), māte(M, Rasma), tēvs(T, B), tēvs(T, Rasma), dzimums(B, vīrietis)
vecāks(M, B), dzimums(M, sieviete) vecāks(M, Rasma), dzimums(M, sieviete) vecāks(T, B), dzimums(T, vīrietis) vecāks(T, Rasma), dzimums(T, vīrietis)
5
Koka lapu faktu predikāti
vecāks(M, B)dzimums(M, sieviete)vecāks(M, Rasma)dzimums(M, sieviete)vecāks(T, B)dzimums(T, vīrietis)vecāks(T, Rasma)dzimums(T, vīrietis)dzimums(B, vīrietis)
Koka lapu faktu predikāti bez dublikātiemvecāks(M, B)dzimums(M, sieviete)vecāks(M, Rasma)vecāks(T, B)dzimums(T, vīrietis)vecāks(T, Rasma)dzimums(B, vīrietis)
VECAKS(M, B) SK(M, B, sieviete) SK(M, B) SK(M,T,B) SK(M,T,B) DZIMUMS(M, sieviete)VECAKS(M, Rasma)
VECAKS (T, B) SK(T, B, vīrietis) SK(T, B)DZIMUMS (T, vīrietis)VECAKS (T, Rasma)DZIMUMS(B, vīrietis)
6
Pakārtoto vaicājumu (skatu) rezultāti
Rezultātu vērtības
7
dzimumsVAR DZIMJūlijs vīrietisAnita sievieteJānis vīrietisRasma sievieteInese vīrietisLiene sievieteZane sievieteMonvīds vīrietis
vecāksVEC BERJūlijs JānisJūlijs RasmaAnita JānisAnita RasmaJānis LieneJānis ZaneInese LieneInese ZaneMonvīds Inese
VAR (M) DZIM (sieviete) VEC (M) BER (B)Anita sieviete Anita JānisAnita sieviete Anita RasmaInese sieviete Inese LieneInese sieviete Inese Zane
VAR (M) BER (B) VEC (M) BER (Rasma)Anita Rasma Anita RasmaAnita Jānis Anita Rasma
VAR (T) DZIM (vīrietis) VEC (T) BER (B)Jūlijs vīrietis Jūlijs JānisJūlijs vīrietis Jūlijs RasmaJānis vīrietis Jānis LieneJānis vīrietis Jānis Zane
VAR (M) BER (B) VAR (T) BER (B)Anita Rasma Jūlijs RasmaAnita Jānis Jūlijs Jānis
VAR (T) BER (B) VEC (T) BER (Rasma)Jūlijs Rasma Jūlijs RasmaJūlijs Jānis Jūlijs Rasma
BER (B) VAR (M) VAR (T) VAR (B) DZIM (vīrietis)Jānis Anita Jūlijs Jānis vīrietis
Dināmiskā SQL izmantošana kopējā vaicājuma realizēšanai
declarev_1 varchar2(200);v_2 varchar2(200);v_3 varchar2(200);v_4 varchar2(200);v_5 varchar2(400);v_6 varchar2(400);v_7 varchar2(800);m1 varchar2(10); m2 varchar2(10); m3 varchar2(10); beginv_1 := '(select P1.NOS as B, P2.VEC_NOS as M from DZIMUMS P1, VECAKS P2where P1. NOS = P2.BERN_NOS and P1.DZIM = ''virietis'')';v_2 := '(select P3.NOS as M from DZIMUMS P3, VECAKS P4where P3.NOS = P4.VEC_NOS and P3.DZIM = ''sieviete'' and P4.BERN_NOS = ''Rasma'')';v_3 := '(select P5.VEC_NOS as T, P5.BERN_NOS as B from VECAKS P5, DZIMUMS P6where P5.VEC_NOS = P6.NOS and P6.DZIM = ''virietis'')';v_4 := '(select P7.VEC_NOS as T from VECAKS P7 where P7.BERN_NOS = ''Rasma'')';
v_5 := '(select P8.B, P8.M from '|| v_1 || ' P8, ' || v_2 || ' P9 where P8.M = P9.M )';v_6 := '(select P10. T, P10.B from ' || v_3 || ' P10, ' || v_4 || ' P11 where P10.T = P11.T )';
v_7 := '(select P12.B, P12.M, P13.T from ' || v_5 || ' P12, ' || v_6 || 'P13 where P12.B = P13.B)'; execute immediate v_7 into m1, m2, m3; DBMS_OUTPUT.PUT_LINE(m1 || ' ' || m2 || ' ' || m3);end;
Juris Inese Janis Rezultāts
8
Faktu predikātu savienošana
vecāks(M, B) Mdzimums(M, sieviete) vecāks(M, Rasma)
B
vecāks(T, B) Tdzimums(T, vīrietis) vecāks(T, Rasma)
B dzimums(B, vīrietis)
Faktu predikāti
dzimums(X,Y) vecāks(Z,Q)
9
VEC_NOS BERN_NOS------------------------------------Anita JanisAnna IneseInese RasmaInese Juris
VEC_NOS BERN_NOS------------------------------------Inese JurisInese Rasma
VEC_NOS BERN_NOS------------------------------ --------Jūlijs JanisMonvids IneseJanis RasmaJanis Juris
VEC_NOS BERN_NOS------------------------------ ---------Janis JurisJanis Rasma
VEC_NOS BERN_NOS------------------------------ --------Inese RasmaInese Juris
BERN_NOS------------------Juris
select M.BERN_NOS
from (select K.VEC_NOS, K.BERN_NOS from
(select C.VEC_NOS, C.BERN_NOS from
(select A.VEC_NOS, A.BERN_NOS from VECAKS A, DZIMUMS B where A.VEC_NOS = B.NOS and B.DZIM = 'sieviete') C,
(select D.VEC_NOS, D.BERN_NOS from VECAKS D where D.BERN_NOS = 'Rasma') E
where C.VEC_NOS = E.VEC_NOS) K,
(select F.VEC_NOS, F.BERN_NOS from
(select G.VEC_NOS, G.BERN_NOS from VECAKS G, DZIMUMS H where G.VEC_NOS = H.NOS and H.DZIM = 'virietis') F,
(select I.VEC_NOS, I.BERN_NOS from VECAKS I where I.BERN_NOS = 'Rasma') J
where F.VEC_NOS = J.VEC_NOS) L
where K.BERN_NOS = L.BERN_NOS) M, DZIMUMS N
where M.BERN_NOS = N.NOS and N.DZIM = 'virietis';
Faktu izgūšana un sasaiste lietojot select ... from (...), (...) ... konstrukciju
10
Deduktīvās datu bāzes datu bāzes tabulas un skatiTabula PERSONAS
NUM NOSAUKUMS DZIMUMS1 Jūlijs vīrietis2 Anita sieviete3 Monvīds vīrietis4 Anna sieviete5 Jānis vīrietis6 Inese sieviete7 Rasma sieviete8 Juris vīrietis
create table PERSONAS(NUM number Primary key,NOSAUKUMS varchar2(30),DZIMUMS char(8));
insert into PERSONAS values(1, 'Julijs', 'virietis');insert into PERSONAS values(2, 'Anita', 'sieviete');insert into PERSONAS values(3, 'Monvids', 'virietis');insert into PERSONAS values(4, 'Anna', 'sieviete');insert into PERSONAS values(5, 'Janis', 'virietis');insert into PERSONAS values(6, 'Inese', 'sieviete');insert into PERSONAS values(7, 'Rasma', 'sieviete');insert into PERSONAS values(8, 'Juris', 'virietis');
create view DZIMUMS(NOS, DZIM) as
select A.NOSAUKUMS, A.DZIMUMS
from PERSONAS A;
create or replace view VECAKS(VEC_NOS, BERN_NOS) as
select A.NOSAUKUMS, B.NOSAUKUMS
from PERSONAS A, PERSONAS B, VECAKI_S C
where A.NUM = C.V_NUM and B.NUM = C.P_NUM;
11
Tabula VECAKI_SP_NUM V_NUM
8 58 67 57 66 46 35 25 1
Skats DZIMUMSNOS DZIMJulijs virietisAnita sievieteMonvīds virietisAnna sievieteJānis virietisInese sievieteRasma sievieteJuris virietis
Skats VECAKSVEC_NOS BERN_NOSJulijs JanisAnita JanisMonvīds IneseAnna IneseJānis RasmaInese RasmaJānis JurisInese Juris
create table VECAKI_S(P_NUM number,V_NUM number);insert into VECAKI_S values(8, 5);insert into VECAKI_S values(8, 6);insert into VECAKI_S values(7, 5);insert into VECAKI_S values(7, 6);insert into VECAKI_S values(6, 4);insert into VECAKI_S values(6, 3);insert into VECAKI_S values(5, 2);insert into VECAKI_S values(5, 1);
Predikāti - fakti
dzimums(X, Y) dzimums(X, sieviete) dzimums(X, vīrietis)
vecāks(X, Y) vecāks(Jānis, Rasma) vecāks(Inese, Rasma)
Predikāti - likumi
māte(M,X): vecāks(M,X), dzimums(M, sieviete)
tēvs(T,X): vecāks(T,X), dzimums(T, vīrietis)
dēls(D,X): vecāks(X,D), dzimums(D, vīrietis)
meita(M, X): vecāks(X,M), dzimums(M, sieviete)
brālis(B,X): māte(M, B), māte(M,X), tēvs(T, B), tēvs(T, X), dzimums(B, vīrietis)
Atribūts: 1) noteikta vērtība; 2) jebkura vērtība; 3) vērtība sasaistei.
12
1.likums māte 1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
2.likums tēvs 1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
3.likums dēls 1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
4.likums meita 1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
5.likums brālis 1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
1.fakts dzimums 1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
2.fakts vecāks 1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
Jauni fakti
1.atribūts 2. atribūts 3.atribūts Saites ar likumiem un faktiem
Atribūtu saites
Pamatdatu bāze Uzdevuma datu bāze
Izveduma mehānisma realizēšana
create table IZVEDUMA_KOKS(PRED_NUM number,PRED_NOS varchar2(20),TIPS varchar2(20),ATR_SK number,ATR1 varchar2(20),ATR2 varchar2(20),ATR3 varchar2(20));
create sequence VIRKNE_1start with 1increment by 1nomaxvalue;
create or replace package IZVEDUMA_MEH issubtype TEKSTS is varchar2(20);procedure VECAKS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure DZIMUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure MATE(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure TEVS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure DELS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure MEITA(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure BRALIS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure VAICAJUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS, atr3 IN OUT TEKSTS, atr4 IN OUT TEKSTS);end;
create or replace package body IZVEDUMA_MEH asprocedure VECAKS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) isbegin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'VECAKS', 'fakts', 2, atr1, atr2, '');end;procedure DZIMUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) isbegin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'DZIMUMS', 'fakts', 2, atr1, atr2, '');end;procedure MATE(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'sieviete';begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'MATE', 'likums', 2, atr1, atr2, '');VECAKS(atr1, atr2);DZIMUMS(atr1, m1);end;
13
procedure TEVS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'virietis' ;begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'TEVS', 'likums', 2, atr1, atr2, '');VECAKS(atr1, atr2);DZIMUMS(atr1, m1);end;procedure DELS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'virietis' ;begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'DELS', 'fakts', 2, atr1, atr2, '');VECAKS(atr2, atr1);DZIMUMS(atr1, m1);end;procedure MEITA(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'sieviete' ;begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'MEITA', 'fakts', 2, atr1, atr2, '');VECAKS(atr2, atr1);DZIMUMS(atr1, m1);end;procedure BRALIS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20);begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'BRALIS', 'likums', 2, atr1, atr2, '');m1 := 'M';MATE(m1, atr1);MATE(m1, atr2);m1 := 'T';TEVS(m1, atr1);TEVS(m1, atr2);m1 := 'virietis';DZIMUMS(atr1, m1);end;procedure VAICAJUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS, atr3 IN OUT TEKSTS, atr4 IN OUT TEKSTS) ispredik varchar2(20);begincase atr1when 'BRALIS' thenIZVEDUMA_MEH.BRALIS(atr2, atr3);when 'MATE' thenIZVEDUMA_MEH.MATE(atr2, atr3);when 'TEVS' thenIZVEDUMA_MEH.TEVS(atr2, atr3);when 'VECAKS' thenIZVEDUMA_MEH.VECAKS(atr2, atr3);when 'DZIMUMS' then
14
IZVEDUMA_MEH.DZIMUMS(atr2, atr3);end case;end;end;
delete IZVEDUMA_KOKS;
drop sequence VIRKNE_1;
create sequence VIRKNE_1start with 1increment by 1nomaxvalue;
declarepar1 varchar2(20) := 'BRALIS';par2 varchar2(20) := 'X';par3 varchar2(20) := 'Rasma';par4 varchar2(20) := '';beginIZVEDUMA_MEH.VAICAJUMS(par1, par2, par3, par4);end;
column PRED_NUM format 99999999;column PRED_NOS format a10;column TIPS format a10;column ATR_SK format 999999999;column ATR1 format a10;column ATR2 format a10;column ATR3 format a10;
select * from IZVEDUMA_KOKS;PRED_NUM PRED_NOS TIPS ATR_SK ATR1 ATR2 ATR3------------------------------------------------------------------------------------------------------ 1 BRALIS likums 2 X Rasma 2 MATE likums 2 M X 3 VECAKS fakts 2 M X 4 DZIMUMS fakts 2 M sieviete 5 MATE likums 2 M Rasma 6 VECAKS fakts 2 M Rasma 7 DZIMUMS fakts 2 M sieviete 8 TEVS likums 2 T X 9 VECAKS fakts 2 T X 10 DZIMUMS fakts 2 T virietis 11 TEVS likums 2 T Rasma 12 VECAKS fakts 2 T Rasma 13 DZIMUMS fakts 2 T virietis 14 DZIMUMS fakts 2 X virietis
15
Vaicājums (Kas ir Rasmas brālis (-ļi)?)
Predikāts 1.atribūts 2.atribūts 3.atribūtsBRALIS B Rasma
Likumu definējumu tabulaLikumanumurs
Sastāv-dalas n.
Lik. vai fakts
Predikāts - likums
Pakārtotie predikāti
Atr.sk. 1.atr. 2.atr. 3.atr.
1 0 L BRALIS 2 B X1 1 L MATE 2 M B1 2 L MATE 2 M X1 3 L TEVS 2 T B1 4 L TEVS 2 T X1 5 F DZIMUMS 2 B virietis2 0 L MATE 2 X Y2 1 F VECAKS 2 X Y2 2 F DZIMUMS 2 X sieviete3 0 L TEVS 2 X Y3 1 F VECAKS 2 X Y3 2 F DZIMUMS 2 X virietis4 0 L DELS 2 X Y4 1 F VECAKS 2 Y X4 2 F DZIMUMS 2 X virietis5 0 L MEITA 2 X Y5 1 F VECAKS 2 Y X5 2 F DZIMUMS 2 X sieviete
Izveduma koka tabulaLik. vai fakts
Predikāts Atr.sk. 1.atr. 2.atr. 3.atr.
L MATE 2 M B
L MATE 2 M RasmaL TEVS 2 T B
16
L TEVS 2 T RasmaF DZIMUMS 2 B virietisF VECAKS 2 M BF DZIMUMS 2 M sievieteF VECAKS 2 M RasmaF DZIMUMS 2 M sievieteF VECAKS 2 T BF DZIMUMS 2 T virietisF VECAKS 2 T RasmaF DZIMUMS 2 T sieviete
Izveduma koka lapu faktu predikāti (eksistē dublikāti)
Predikāts Atr.sk. 1.atr. 2.atr. 3.atr.DZIMUMS 2 B virietisVECAKS 2 M BDZIMUMS 2 M sievieteVECAKS 2 M RasmaDZIMUMS 2 M sievieteVECAKS 2 T BDZIMUMS 2 T virietisVECAKS 2 T RasmaDZIMUMS 2 T vīrietis
Dublējošo predikātu izslēgšana (vienas un tās pašas atribūtu vērtības)
1 DZIMUMS 2 B virietis2 VECAKS 2 M B3 DZIMUMS 2 M sieviete4 VECAKS 2 M Rasma5 VECAKS 2 T B6 DZIMUMS 2 T virietis7 VECAKS 2 T Rasma
17
Izveduma koka faktu predikātu savienošana
Predikāts Atr.skaits 1.atr. 2.atr. 3.atr. Savienojums arP1 DZIMUMS 2 B virietis P2P2 VECAKS 2 M B P1P3 DZIMUMS 2 M sieviete P4P4 VECAKS 2 M Rasma P3P5 VECAKS 2 T B P6P6 DZIMUMS 2 T virietis P5P7 VECAKS 2 T Rasma P7------------------------------------------------------------------------------------------------------------------------P1 DZIMUMS 2 B virietis P2P2 VECAKS 2 M B P1
P3 DZIMUMS 2 M sieviete P4P4 VECAKS 2 M Rasma P3
P5 VECAKS 2 T B P6P6 DZIMUMS 2 T virietis P5
P7 VECAKS 2 T Rasma P7
-----------------------------------------------------------------------------------------------------------------------P8 2 B M P9P9 1 M P8P10 2 T B P11P11 1 T P10
-----------------------------------------------------------------------------------------------------------------------P8 2 B M P9P9 1 M P8
P10 2 T B P11P11 1 T P10
------------------------------------------------------------------------------------------------------------------------P12 2 B M P13P13 2 T B P12
------------------------------------------------------------------------------------------------------------------------P12 2 B M P13P13 2 T B P12
-------------------------------------------------------------------------------------------------------------------------
18
P14 2 B M T
Faktu predikātu savienojumu realizējošie SELECT vaicājumi
(select P1.NOS as B, P2.VEC_NOS as M from DZIMUMS P1, VECAKS P2where P1. NOS = P2.BERN_NOS and P1.DZIM = 'virietis') P8
(select P3.NOS as M from DZIMUMS P3, VECAKS P4where P3.NOS = P4.VEC_NOS and P3.DZIM = 'sieviete' and P4.BERN_NOS = 'Rasma') P9
(select P5.VEC_NOS as T, P5.BERN_NOS as B from VECAKS P5, DZIMUMS P6where P5.VEC_NOS = P6.NOS and P6.DZIM = 'virietis') P10
(select P7.VEC_NOS as T from VECAKS P7 where P7.BERN_NOS = 'Rasma') P11---------------------------------------------------------------------------------------------------------------------------(select P8.B, P8.Mfrom ( ... ) P8, ( ... ) P9where P8.M = P9.M ) P12
(select P10. T, P10.Bfrom (...) P10, (...) P11where P10.T = P11.T ) P13 ---------------------------------------------------------------------------------------------------------------------------(select P12.B, P12.M, P13.Tfrom ( ... ) P12, ( ... ) P13where P12.B = P13.B);
19
Dināmiskā SQL izmantošana kopējā vaicājuma realizēšanai
declarev_1 varchar2(200);v_2 varchar2(200);v_3 varchar2(200);v_4 varchar2(200);v_5 varchar2(400);v_6 varchar2(400);v_7 varchar2(800);m1 varchar2(10); m2 varchar2(10); m3 varchar2(10); beginv_1 := '(select P1.NOS as B, P2.VEC_NOS as M from DZIMUMS P1, VECAKS P2where P1. NOS = P2.BERN_NOS and P1.DZIM = ''virietis'')';v_2 := '(select P3.NOS as M from DZIMUMS P3, VECAKS P4where P3.NOS = P4.VEC_NOS and P3.DZIM = ''sieviete'' and P4.BERN_NOS = ''Rasma'')';v_3 := '(select P5.VEC_NOS as T, P5.BERN_NOS as B from VECAKS P5, DZIMUMS P6where P5.VEC_NOS = P6.NOS and P6.DZIM = ''virietis'')';v_4 := '(select P7.VEC_NOS as T from VECAKS P7 where P7.BERN_NOS = ''Rasma'')';
v_5 := '(select P8.B, P8.M from '|| v_1 || ' P8, ' || v_2 || ' P9 where P8.M = P9.M )';v_6 := '(select P10. T, P10.B from ' || v_3 || ' P10, ' || v_4 || ' P11 where P10.T = P11.T )';
v_7 := '(select P12.B, P12.M, P13.T from ' || v_5 || ' P12, ' || v_6 || 'P13 where P12.B = P13.B)'; execute immediate v_7 into m1, m2, m3; DBMS_OUTPUT.PUT_LINE(m1 || ' ' || m2 || ' ' || m3);end;
Juris Inese Janis Rezultāts
20
filtrēšanas vērtības savienošanas vērtības
-----------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
21
Skats DZIMUMSNOSAUKUMS DZIMUMSJulijs virietisAnita sievieteMonvids virietisAnna sievieteJanis virietisInese sievieteRasma sievieteJuris virietis
Skats VECAKSVEC_NOS BERN_NOSJulijs JanisAnita JanisMonvids IneseAnna IneseJanis RasmaInese RasmaJanis JurisInese Juris
NOSAUKUMS (B) DZIMUMS (vīrietis) VEC_NOS (M) BERN_NOS (B)Janis virietis Julijs JanisJanis virietis Anita JanisJuris virietis Janis JurisJuris virietis Inese Juris
NOSAUKUMS (M) DZIMUMS (sieviete) VEC_NOS (M) BERN_NOS (Rasma)Inese sieviete Inese Rasma
NOSAUKUMS (T) DZIMUMS (vīrietis) VEC_NOS (T) BERN_NOS (B)Julijs virietis Julijs JanisMonvids virietis Monvids IneseJanis virietis Janis RasmaJanis virietis Janis Juris
VEC_NOS (T) BERN_NOS (Rasma)Janis RasmaInese Rasma
(B) (M) (M)Juris Inese Inese
(T) (B) (T)Janis Rasma JanisJanis Juris Janis
(B) (M) (T) (B)Juris Inese Janis Juris
(B) (M) (T)Juris Inese Janis
Pakārtoto vaicājumu rezultāti
Likumu tabulas veidošana datu bāzē
Tabula LIKUMI
L_N
UM
L_N
OS
SAST
_SK
AT
R_1
AT
R_2
AT
R_3
PRE
D_N
OS
PRE
D_T
IPS
AT
R_S
K
AT
R_1
AT
R_2
AT
R_3
1 BRALIS 5 #1 #2 NULL MATE L 2 M #1 NULLMATE L 2 M #2 NULLTEVS L 2 T #1 NULLTEVS L 2 T #2 NULLDZIMUMS F 2 #1 virietis NULL
2 MATE 2 #1 #2 NULL VECAKS F 2 #1 #2 NULLDZIMUMS F 2 #1 sieviete NULL
3 TEVS 2 #1 #2 NULL VECAKS F 2 #1 #2 NULLDZIMUMS F 2 #1 virietis NULL
4 DELS 2 #1 #2 NULL VECAKS F 2 #2 #1 NULLDZIMUMS F 2 #1 virietis NULL
5 MEITA 2 #1 #2 NULL VECAKS F 2 #2 #1 NULLDZIMUMS F 2 #1 sieviete NULL
22
Izveduma koka tabulas veidošana datu bāzē
Tabula VAICAJUMSP_NUM PRED ATR_1 ATR_2 ATR_31 BRALIS B Rasma NULL
Tabula IZVED_KOKS
L_N
UM
L_N
OS
SAST
_SK
AT
R_1
AT
R_2
AT
R_3
PRE
D_N
OS
PRE
D_T
IPS
AT
R_S
K
AT
R_1
AT
R_2
AT
R_3
1 BRALIS 5 #1 #2 NULL MATE L 2 M #1 NULLMATE L 2 M #2 NULLTEVS L 2 T #1 NULLTEVS L 2 T #2 NULLDZIMUMS F 2 #1 virietis NULL
2 MATE 2 #1 #2 NULL VECAKS F 2 #1 #2 NULLDZIMUMS F 2 #1 sieviete NULL
2 MATE 2 #1 #2 NULL VECAKS F 2 #1 #2 NULLDZIMUMS F 2 #1 sieviete NULL
3 TEVS 2 #1 #2 NULL VECAKS F 2 #1 #2 NULLDZIMUMS F 2 #1 virietis NULL
3 TEVS 2 #1 #2 NULL VECAKS F 2 #1 #2 NULLDZIMUMS F 2 #1 virietis NULL
23
create or replace type SASTAVDALA as object ( PRED_NOS varchar2(20), PRED_TIPS char(1), ATR_SK number, ATR_1 varchar2(20), ATR_2 varchar2(20), ATR_3 varchar2(20));create or replace type SASTAVDALAS as table of SASTAVDALA;
create table LIKUMI( L_NUM number Primary key, L_NOS varchar2(20), SAST_SK number, ATR_1 varchar2(20), ATR_2 varchar2(20), ATR_3 varchar2(20), L_SAST SASTAVDALAS) nested table L_SAST store as PAKARTOTI_PREDIKATI;
insert into LIKUMI values(1, 'BRALIS', 5, '#1', '#2', NULL, SASTAVDALAS( SASTAVDALA('MATE', 'L', 2, 'M', '#1', NULL), SASTAVDALA('MATE', 'L', 2, 'M', '#2', NULL), SASTAVDALA('TEVS', 'L', 2, 'T', '#1', NULL), SASTAVDALA('TEVS', 'L', 2, 'T', '#2', NULL), SASTAVDALA('DZIMUMS', 'F', 2, '#1', 'virietis', NULL) ) );
insert into LIKUMI values(2, 'MATE', 2, '#1', '#2', NULL, SASTAVDALAS( SASTAVDALA('VECAKS', 'F', 2, '#1', '#2', NULL), SASTAVDALA('DZIMUMS', 'F', 2, '#1', 'sieviete', NULL))); insert into LIKUMI values(3, 'TEVS', 2, '#1', '#2', NULL, SASTAVDALAS( SASTAVDALA('VECAKS', 'F', 2, '#1', '#2', NULL), SASTAVDALA('DZIMUMS', 'F', 2, '#1', 'virietis', NULL)));
insert into LIKUMI values(4, 'DELS', 2, '#1', '#2', NULL, SASTAVDALAS( SASTAVDALA('VECAKS', 'F', 2, '#2', '#1', NULL), SASTAVDALA('DZIMUMS', 'F', 2, '#1', 'virietis', NULL)));
insert into LIKUMI values(5, 'MEITAS', 2, '#1', '#2', NULL, SASTAVDALAS( SASTAVDALA('VECAKS', 'F', 2, '#2', '#1', NULL), SASTAVDALA('DZIMUMS', 'F', 2, '#1', 'sieviete', NULL)));
24
create table IZVED_KOKS( L_NUM number, L_NOS varchar2(20), SAST_SK number, ATR_1 varchar2(20), ATR_2 varchar2(20), ATR_3 varchar2(20), L_SAST SASTAVDALAS) nested table L_SAST store as PAKARTOTI_PREDIKATI_1;
create table VAICAJUMS(P_NUM number Primary key,PRED varchar2(20),ATR_1 varchar2(20),ATR_2 varchar2(20),ATR_3 varchar2(20));
insert into VAICAJUMS values(1, 'BRALIS', 'B', 'Rasma', NULL);
Substitūciju izdarīšana
declarem1 varchar2(800);m2 varchar2(800);beginm1:= 'insert into LIKUMI values(1, ''BRALIS'', 5, ''#1'', ''#2'', NULL, SASTAVDALAS( SASTAVDALA(''MATE'', ''L'', 2, ''M'', ''#1'', NULL), SASTAVDALA(''MATE'' , ''L'', 2, ''M'', ''#2'', NULL), SASTAVDALA(''TEVS'', ''L'', 2, ''T'', ''#1'', NULL), SASTAVDALA(''TEVS'', ''L'', 2, ''T'', ''#2'', NULL), SASTAVDALA(''DZIMUMS'', ''F'', 2, ''#1'', ''virietis'', NULL) ) );';
m2 := REPLACE(m1, '#1', 'B');--DBMS_OUTPUT.PUT_LINE(m2);end;
25
Izveduma mehānisma realizēšana
create table IZVEDUMA_KOKS(PRED_NUM number,PRED_NOS varchar2(20),TIPS varchar2(20),ATR_SK number,ATR1 varchar2(20),ATR2 varchar2(20),ATR3 varchar2(20));
create sequence VIRKNE_1start with 1increment by 1nomaxvalue;
create or replace package IZVEDUMA_MEH issubtype TEKSTS is varchar2(20);procedure VECAKS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure DZIMUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure MATE(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure TEVS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure DELS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure MEITA(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure BRALIS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS);procedure VAICAJUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS, atr3 IN OUT TEKSTS, atr4 IN OUT TEKSTS);end;
create or replace package body IZVEDUMA_MEH asprocedure VECAKS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) isbegin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'VECAKS', 'fakts', 2, atr1, atr2, '');end;procedure DZIMUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) isbegin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'DZIMUMS', 'fakts', 2, atr1, atr2, '');end;procedure MATE(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'sieviete';begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'MATE', 'likums', 2, atr1, atr2, '');VECAKS(atr1, atr2);DZIMUMS(atr1, m1);end;
26
procedure TEVS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'virietis' ;begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'TEVS', 'likums', 2, atr1, atr2, '');VECAKS(atr1, atr2);DZIMUMS(atr1, m1);end;procedure DELS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'virietis' ;begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'DELS', 'fakts', 2, atr1, atr2, '');VECAKS(atr2, atr1);DZIMUMS(atr1, m1);end;procedure MEITA(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20) := 'sieviete' ;begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'MEITA', 'fakts', 2, atr1, atr2, '');VECAKS(atr2, atr1);DZIMUMS(atr1, m1);end;procedure BRALIS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS) ism1 varchar2(20);begin insert into IZVEDUMA_KOKS values(VIRKNE_1.nextval,'BRALIS', 'likums', 2, atr1, atr2, '');m1 := 'M';MATE(m1, atr1);MATE(m1, atr2);m1 := 'T';TEVS(m1, atr1);TEVS(m1, atr2);m1 := 'virietis';DZIMUMS(atr1, m1);end;procedure VAICAJUMS(atr1 IN OUT TEKSTS, atr2 IN OUT TEKSTS, atr3 IN OUT TEKSTS, atr4 IN OUT TEKSTS) ispredik varchar2(20);begincase atr1when 'BRALIS' thenIZVEDUMA_MEH.BRALIS(atr2, atr3);when 'MATE' thenIZVEDUMA_MEH.MATE(atr2, atr3);when 'TEVS' thenIZVEDUMA_MEH.TEVS(atr2, atr3);when 'VECAKS' thenIZVEDUMA_MEH.VECAKS(atr2, atr3);when 'DZIMUMS' then
27
IZVEDUMA_MEH.DZIMUMS(atr2, atr3);end case;end;end;
delete IZVEDUMA_KOKS;
drop sequence VIRKNE_1;
create sequence VIRKNE_1start with 1increment by 1nomaxvalue;
declarepar1 varchar2(20) := 'BRALIS';par2 varchar2(20) := 'X';par3 varchar2(20) := 'Rasma';par4 varchar2(20) := '';beginIZVEDUMA_MEH.VAICAJUMS(par1, par2, par3, par4);end;
column PRED_NUM format 99999999;column PRED_NOS format a10;column TIPS format a10;column ATR_SK format 999999999;column ATR1 format a10;column ATR2 format a10;column ATR3 format a10;
select * from IZVEDUMA_KOKS;PRED_NUM PRED_NOS TIPS ATR_SK ATR1 ATR2 ATR3------------------------------------------------------------------------------------------------------ 1 BRALIS likums 2 X Rasma 2 MATE likums 2 M X 3 VECAKS fakts 2 M X 4 DZIMUMS fakts 2 M sieviete 5 MATE likums 2 M Rasma 6 VECAKS fakts 2 M Rasma 7 DZIMUMS fakts 2 M sieviete 8 TEVS likums 2 T X 9 VECAKS fakts 2 T X 10 DZIMUMS fakts 2 T virietis 11 TEVS likums 2 T Rasma 12 VECAKS fakts 2 T Rasma 13 DZIMUMS fakts 2 T virietis 14 DZIMUMS fakts 2 X virietis
28
Tabulas IZVEDUMA_KOKS aizpildīšana un dublējošo faktu predikātu nodzēšana
declaresubtype PREDIKATS is varchar2(20);m1 PREDIKATS;m2 PREDIKATS;m3 PREDIKATS;begindelete IZVEDUMA_KOKS;m1 := 'B';m2 := 'Rasma';DEDUKCIJA.BRALIS(m1, m2);-- Dublējošu rindu (faktu predikātu) nodzēšanadelete from IZVEDUMA_KOKS A where A.ROWID =(select MIN(B.ROWID) from IZVEDUMA_KOKS B where B.PRED_NOS = A.PRED_NOSand B.ATR1 = A.ATR1 and B.ATR2 = A.ATR2group by B.PRED_NOS, B.ATR1, B.ATR2having COUNT(B.PRED_NOS)>1);end;
select * from IZVEDUMA_KOKS;
PRED_NOS KOL1 ATR1 KOL2 ATR2 KOL3 ATR3-----------------------------------------------------------------------------------------------------VECAKS VEC_NOS M BERN_NOS BVECAKS VEC_NOS M BERN_NOS RasmaDZIMUMS NOS M DZIMUMS sievieteVECAKS VEC_NOS T BERN_NOS BVECAKS VEC_NOS T BERN_NOS RasmaDZIMUMS NOS T DZIMUMS virietisDZIMUMS NOS B DZIMUMS virietis
29
PRED_NOS ATR1 ATR2 ATR3-----------------------------------------------VECAKS M B DZIMUMS M sieviete
VECAKS M Rasma
VECAKS T B DZIMUMS T virietis
VECAKS T Rasma
DZIMUMS B virietis
PRED_NOS ATR1 ATR2 ATR3 PRED_NOS ATR1 ATR2 ATR3VECAKS M B DZIMUMS M sieviete P1, P2VECAKS M Rasma P3VECAKS T B DZIMUMS T virietis P4, P5VECAKS T Rasma P6DZIMUMS B virietis P7
M B P9M P10
T B P11T P12
B P13
M B M P9, P10T B T P11, P12B P13
M B P14T B P15
B P16
M B T B P14, P15B P16
M B T P17B P18
M B T B P19
M B T
30
Faktu predikātu savienojumus realizējošie SELECT vaicājumi
(select P1.VEC_NOS as M, P2.NOS as B from VECAKS P1, DZIMUMS P2where P1. VEC_NOS = P2.NOS and P2.DZIM = 'sieviete') P9
(select P3.VEC_NOS as M from VECAKS P3where P3.BERN_NOS = 'Rasma') P10
(select P4.VEC_NOS as T, P4.BERN_NOS as B from VECAKS P4, DZIMUMS P5where P4.VEC_NOS = P5.NOS and P5.DZIM = 'virietis') P11
(select P6.VEC_NOS as T from VECAKS P6, DZIMUMS P7 where P6.VEC_NOS = P7.NOS and P6.BERN_NOS = 'Rasma' and P7.DZIM ='virietis') P12
(select P8.NOS as B from DZIMUMS P8where P8.DZIM = 'virietis') P13---------------------------------------------------------------------------------------------------------------------------(select P9.M, P9.Bfrom (select P1.VEC_NOS as M, P2.NOS as B from VECAKS P1, DZIMUMS P2 where P1. VEC_NOS = P2.NOS and P2.DZIM = 'sieviete') P9, (select P3.VEC_NOS as M from VECAKS P3 where P3.BERN_NOS = 'Rasma') P10where P9.M = P10.M ) P14
(select P11. T, P11.Bfrom (select P4.VEC_NOS as T, P4.BERN_NOS as B from VECAKS P4, DZIMUMS P5 where P4.VEC_NOS = P5.NOS and P5.DZIM = 'virietis') P11, (select P6.VEC_NOS as T from VECAKS P6, DZIMUMS P7 where P6.VEC_NOS = P7.NOS and P6.BERN_NOS = 'Rasma' and P7.DZIM ='virietis') P12where P11.T = P12.T ) P15
(select P13.Bfrom (select P8.NOS as B from DZIMUMS P8 where P8.DZIM = 'virietis') P13 ) P16
31
---------------------------------------------------------------------------------------------------------------------------(select P14.M, P14.B, P15.Tfrom ( ... ) P14, ( ... ) P15where P14.B = P15.B) P17
(select P16.NOS Bfrom ( ...) P16 ) P18--------------------------------------------------------------------------------------------------------------------------(select P17.M, P17.B, P17.Tfrom ( ... ) P17, ( ... ) P18where P17.B = P18.B) P19
32
M---------JanisInese
M B------------------------Inese IneseInese IneseAnna AnnaAnita Anita
T B----------------------------Julijs JanisMonvids IneseJanis RasmaJanis Juris
T---------Janis
B-------------JulijsMonvidsJanisJuris
M B---------------------Inese IneseInese Inese
T B-------------------Janis JurisJanis Rasma
B------------JulijsMonvidsJanisJuris
Dināmiskā SQL izmantošana kopējā vaicājuma realizēšanai
declarev_1 varchar2(200);v_2 varchar2(200);v_3 varchar2(200);v_4 varchar2(200);v_5 varchar2(400);v_6 varchar2(400);v_7 varchar2(800);m1 varchar2(10); m2 varchar2(10); m3 varchar2(10); beginv_1 := '(select P1.NOS as B, P2.VEC_NOS as M from DZIMUMS P1, VECAKS P2where P1. NOS = P2.BERN_NOS and P1.DZIM = ''virietis'')';v_2 := '(select P3.NOS as M from DZIMUMS P3, VECAKS P4where P3.NOS = P4.VEC_NOS and P3.DZIM = ''sieviete'' and P4.BERN_NOS = ''Rasma'')';v_3 := '(select P5.VEC_NOS as T, P5.BERN_NOS as B from VECAKS P5, DZIMUMS P6where P5.VEC_NOS = P6.NOS and P6.DZIM = ''virietis'')';v_4 := '(select P7.VEC_NOS as T from VECAKS P7 where P7.BERN_NOS = ''Rasma'')';
v_5 := '(select P8.B, P8.M from '|| v_1 || ' P8, ' || v_2 || ' P9 where P8.M = P9.M )';v_6 := '(select P10. T, P10.B from ' || v_3 || ' P10, ' || v_4 || ' P11 where P10.T = P11.T )';
v_7 := '(select P12.B, P12.M, P13.T from ' || v_5 || ' P12, ' || v_6 || 'P13 where P12.B = P13.B)'; execute immediate v_7 into m1, m2, m3; DBMS_OUTPUT.PUT_LINE(m1 || ' ' || m2 || ' ' || m3);end;
Juris Inese Janis Rezultāts
33
34
Loģiskās programmēšanas valodas PROLOG pamatjēdzieni
1. Attīstoties dažādām teorēmu pierādīšanas metodēm, izveidojās loģiskās programmēšanas
valoda PROLOG (PROgramming LOGic). Tās autori bija Robert Kowalski (Edinburga),
Maarten van Emden (Edinburga), Alain Colmerauer (Marseļa).
2. Valoda PROLOG ir programmēšanas valoda rakstzīmju tipa datu apstrādei.
3. Loģiskās programmēšanas valoda izmanto sekojošus jēdzienus:
1) atoms – burtu un ciparu simbolu kopa, kas sākas ar mazo burtu: mašīna, grāmata, jānis;
2) konstante – atoms vai skaitlis: jānis, 123;
3) mainīgais - burtu un ciparu simbolu kopa, kas sākas ar lielo burtu: X, Y, Main_1
(mainīgais ar apzīmējumu _ norāda uz jebkuru mainīgo);
4) funktors –
5) terms – atomi un mainīgie;
6) dizjunkts – literāļu kopa, ir trīs tipu dizjunkti:
- likums – sastāv no galvas un ķermeņa:
māte( X, Y) : - persona( X, , sieviete), vecāki( X, Y).
- fakts – sastāv no viena literāļa: vecāki( Rasma, Pēteris).
- mērķis – dizjunkts bez galvas daļas, tas ir vaicājums: ? – vecāki( X, Jānis).
7) PROLOG-a mehānisms – izveduma mašīna
35
Valoda DATALOGDeduktīvo datu bāzu sistēmās viens no galvenajiem izstrādes virzieniem ir valoda DATALOG. Šī valoda paplašina relāciju bāzu valodas. DATALOG ļauj optimizēt SQL vaicājumus. DATALOG datu bāzēm semantika ir ļoti līdzīga loģiskās programmēšanas valodas semantikai, taču tiek ņemts vērā, ka deduktīva datu bāze sastāv no diviem komponentiem. Paplašinātā datu bāze mainās (dati tiek pievienoti, laboti, dzēsti), taču papildinātā datu bāze ir nemainīga, tātad tā paliek sākotnēji definēta. Ir 3 pieejas DATALOG datu bāzu semantikas modelēšanā:
1. Teorētiska modeļa semantika.2. “Darbs no augšas uz leju” semantika.3. “Darbs no lejas uz augšu” semantika.
Vaicājumi(queries)
Tāpat kā loģiskajā programmēšanā, arī deduktīvajās datu bāzēs vaicājums ir aprakstīts kā mērķis formā A1,....,An kur A1,....,An ir atomi.Svarīga atšķirība starp Prolog un DATALOG valodām ir tāda, ka ja Prologā tiek noteikts vai eksistē vismaz viens risinājums, tad DATALOG nosaka visus risinājumus. Šāda mērķa semantika ir iespējama pateicoties kopu-orientētai (set-oriented) pieejai vaicājumos, kur katram vaicājumam tiek noteiktas visas atbildes.
DATALOG pielikumi (extensions)
DATALOG nav pilnībā piemērota datu lietojumprogrammām, jo tajā nav daudzas iespējas, kas nepieciešamas lietojumprogrammu pilnvērtīgai uzturēšanai. Lai risinātu šādu trūkumu, ir izstrādāti DATALOG pielikumi, daži no kuriem pat ir iekļauti izstrādes prototipos.Noliegums – lai valoda DATALOG būtu izteiksmīgāka un varētu apstrādāt specifiskus vaicājumus, tai ir izveidots nolieguma pielikums. Visbiežāk noliegumu nepieciešams izmantot likumos, kur atoms A i ir jāparāda kā Ai. Šādu valodu sauc par DATALOG. Semantika un skaitļošanas problēmas galvenokārt ir saistītas ar sintakses ierobežojumiem, kā arī pielāgojot citu semantiku. Labi aprakstītai semantikai pamatideja ir tāda, ka datubāze nesatur tikai patiess/nepatiess informāciju par katru faktu. Drīzāk dažiem faktiem datu bāze varētu glabāt tādu informāciju, ka fakta patiesā vērtība nav zināma. Vairumam datu bāzu lietojumprogrammām ir jābūt spējai formulēt salīdzināšanas apgalvojumus, kad tiek piekļūts datu bāzes datiem. Salīdzināšanas apgalvojumi starp mainīgajiem vai konstantēm DATALOG likumā vai mērķī tiek formulēti kā salīdzināšanas saites, ko var apzīmēt ar tādiem simboliem kā , , , . Ir svarīgi šādas salīdzināšanas saites iebūvēt DATALOG, lai datu salīdzināšana tiktu veikta jau pie datu atlases. Taču, salīdzināšanas apgalvojumu iekļaušana sistēmā var novest pie bezgalīga atbilžu skaita, ja vien netiek ievēroti kādi drošības pasākumi.
DATALOG datu bāzu īpašības
Galvenā problēma ir noteikt vai īpašība pakļaujas papildinātās datu bāzes statiskai analīzei. Pieņemot, ka apgalvojums ir neapmierināms (unsatisfiable)- tātad apgalvojums neatrod nevienu risinājumu
36
paplašinātai datu bāzei. Optimizācijas nolūkā šo apgalvojumu varētu izslēgt no papildinātās datu bāzes, taču šāda rīcība varētu izsaukt kļūdu. Svarīgākās īpašības ir:
1. Vienādība;2. Apmierinātība;3. Ierobežotība.
Šīs īpašības tiek iestrādātas kā DATALOG valodā tā arī dažos tās paplašinājumos.
Deduktīvo datu bāzu un loģisko programmēšanas sistēmu atšķirības
Galvenokārt tās ir saistītas ar to, ka deduktīvās datu bāzes uzglabā un vada lielus komplicētu datu apjomus, kamēr loģikas lietojumprogramma atbalsta programmēšanu un tai nav vajadzīgas iebūvētas speciālas tehnikas datu modelēšanai un vadīšanai. Izdala šādas galvenās atšķirības starp abiem sistēmu tipiem:
1. Deduktīva datu bāze parasti glabā vairāk faktus nekā likumus;2. Apgalvojumi deduktīvā datu bāzē dalās kā paplašinātie un papildinātie;3. Deduktīvo datu bāzu valodas, piemēram DATALOG ir bez funkcijām, vai atbalsta tikai
dažas, ļoti specifiskas funkcijas. Loģiskās programmēšanas valodas, tieši pretēji, ir pārblīvētas ar funkcijām;
4. DDB uztur ierobežojumu aprakstu;5. DDB tiek meklēti visi risinājumi, bet loģiskajā programmēšanā tikai viens risinājums no
visiem.
37
Loģiskās programmēšanas valodas un DBS kopdarbība1. Sasaiste – divu autonomu sistēmu interfeisa izveide, lai apmainītos ar datiem (datu bāze loģiskās programmēšanas valodas izpildes vides operatīvā atmiņa). Ābu autonomo sistēmu apvienojums tiek saukts par CPR sistēmām (Coupling Prolog to Relational databases).
a) vājā sasaiste (statiskā sasaiste)– datu apmaiņa notiek neatkarīgi no izveduma realizēšanas procesa, vienā datu apmaiņas procesā tiek izgūti visi nepieciešamie fakti;b) ciešā sasaiste (dināmiskā sasaiste) - datu apmaiņa notiek izveduma realizēšanas procesā, kad jāiegūst kārtējie konkrētie fakti.
2. Integrācija – jaunas vienotas sistēmas izveide, loģiskās programmēšanas valodas iekļaušana datu bāzes servera programmēšanas valodu kopā.
38
Loģiskās programmēšanas
valodaDatu bāzes sistēma
Loģiskās programmēšanas
valodaDatu bāzes sistēma
CPR sistēmu komponentes
1. Prologa mehānisms – realizē PROLOG-a programma, izmantojot standarta izveduma mehānismu, bet var būt arī iespējas adaptēties konkrētai datu bāzes vadības sistēmai.
2. Prolog-a interfeiss – ļauj atpazīt un izmantot datu bāzes predikātus.
3. Datu bāzes interfeiss – PROLOG-a sistēmas pieprasījumu atpazīšana un atbildes nodošana:1) vienpredikāta vaicājums, formulējas katram datu bāzes predikātam;2) daudzpredikātu vaicājums, formulējas vairākiem datu bāzes predikātiem vienlaicīgi;3) agregātu vaicājumi, formulējas agregātfunkciju aprēķināšana datu bāzes predikātu grupām;4) rekursīvie vaicājumi, formulējas rekursīviem predikātiem;5) korteži tiek atgriezti pa vienam;6) tiek atgriezta kortežu grupa.
4. Datu bāzes mehānisms – veic datu meklēšanu un atjaunošanu.
39
Datu bāzes un loģiskās programmēšanas jēdzienu atbilstība
Datu bāzes tehnoloģijas jēdzieni
Loģiskās programmēšanas jēdzieni
datu attieksme predikātsatribūts predikāta argumentskortežs fakts, bāzes dizjunktsskats likumsvaicājums mērķisierobežojums Mērķis, atgriežot vēlamo patiesuma vērtību (patiess,
nepatiess)
40
CPR sistēmu pamatjēdzieni
1. Datu bāzes predikāts – PROLOG-a sistēmas pieprasījuma rezultāts: tab1(a, b, X, Y, c).
2. Bāzes konjunkcija – datu bāzes predikātu un aritmētisko salīdzinājumu predikātu virkne: db1(X, a, Y), db2(Y, Z, V), (V = b).
3. Faktu kārtība: - datu bāzē nav svarīga; - PROLOG-a izpildes vidē no tās var būt atkarīgs rezultāts.
41
Deduktīvu datu bāzu prototipi
1. NAIL! -
2. MegaLog -
3. Lola -
4. Coral -
5. Aditi -
6. PRO_SQL – sistēma, kurā loģiskā programmēšanas valoda PROLOG sasaistīta ar SQL/DS
sistēmu (IBM Research Center at Yorktown Heights).
7. EDUCE - sistēma, kurā loģiskā programmēšanas valoda PROLOG sasaistīta ar DBVS
INGRES (European Computer Industry Research Center).
8. ESTEAM - firmas Philips izstrāds interfeiss sistēmai ESTEAM un DBVS INGRESS QUEL
vaicājumu valodā.
9. BERMUDA -
10. PRIMO – interfeiss starp Arity-Prolog sistēmu un DBVS Oracle, izstrāde veikta Modenas
universitātē Itālijā.
11. QUINTUS-PROLOG – firmas Quintus Computer System izstrādne, kurā izveidots interfeiss
ar DBVS Unify.
42