Hỏi P3 P2 q4 P1 q3 q2 q1 Hỏi P2 P1 q2 q1
Về mặt cơ bản ngôn ngữ Datalog với các câu hỏi không đệ quy được xem như tương đương với đại số quan hệ về khả năng thể hiện.
Với các câu hỏi đệ quy cho phép người ta một công cụ mạnh hơn các ngôn ngữ quan quan hệ. Điều này ngôn ngữ Datalog cho phép hỏi các câu hỏi không được phép trong đại số quan hệ.
(1) Phép hợp : là tập các luật có cùng đầu luật
Hỏi(X1, X2,…,Xn) ← r1(X1, X2,…,Xn) Hỏi(Y1, Y2,…,Yn) ← r2(Y1, Y2,…,Yn) Ví dụ 1: (r1) Chamẹ(x,y) ← Bố(x,y)
(r2) Chamẹ(x,y) ← mẹ(x,y)
Ví dụ 2:Tìm tên của các khách hàng tại chi nhánh “Hà Nội”, làm như sau:
Hỏi(Y) ← Vay(“Hà Nội”, X, Y, Z) Hỏi(B) ← Gưi tiền(“Hà Nội”, A, B, C)
Chú ý: hai luật thể hiện phép hợp là tách biệt
(2) Phép chọn : ứng với một luật mà thân luật có một vị từ so sánh -> biểu thức chọn.
Phép chọn chọn các n_bộ trong quan hệ r được viết dưới dạng câu hỏi:
r(x1, x2,…, xn)?
Trong đó: xi (i=1, 2,..,n) là tên biến hay một hằng số. Ví dụ 1: Chamẹ(x,y) ← Chamẹ(x,y) , y= Dũng
điều này ≈ σ y = ‘Dũng’(Chamẹ(x,y)) ( phép chọn với điều kiện là y= ‘Dũng’)
Ví dụ 2: Chọn (tìm kiếm) tên của những khách hàng vay quá 1000? Hỏi(Y) ← Vay(“Hà Nội”, X, Y, Z), Z >1000
(3) Phép chiếu : là phép toán ứng với một số luật mà có một số biến ở thân luật mà không xuất hiện trong đầu luật.
(4) Phép kết nối : là phép ứng với luật mà có biến chung ở các vị từ của thân luật.
Phép kết nối hai quan hệ r1 và r2 được viết dưới dạng Datalog như sau:
Hỏi(X1, X2,…,Xn, Y1, Y2,.., Ym) ← r1(X1, X2,…,Xn), r2(Y1, Y2,.., Ym)
Trong đó: Xi, Yj | i=1,2,..,n và j=1,2,..,m là các tên biến phân biệt nhau.
Ví dụ 1: (r3) Ôngbà(x,y) ← Chamẹ(x,z) , Chamẹ(z,y) (5) Khả năng đệ quy:
Ví dụ 1: như (r7)
(r4) Bố(x,y) ← (r7) : TổTiên(x,y) ← Chamẹ(x,z) , TổTiên(z,y)
Ví dụ 2: Giả sử có lược đồ quan hệ:
Quản lý(Tên nhân công, tên người quản lý)
Lược đồ thể hiện mối quan hệ người quản lý và nhân công. Giả sử “Quản lý” là một quan hệ theo mô hình trên.
Tên nhân công Tên người quản lý Mỗ Hoa Mai Lan Chén Tích Mễ Mỗ Mỗ Mỗ Hoa Hoa
Yêu cầu:1) Tìm tên của những người làm việc trực tiếp dưới quyền của ông
Mỗ, tức phụ thuộc mức 1, viết như sau: Hỏi(X) ← Quản lý(X, “Mỗ”)
2) Để tìm tên của những người làm việc trực tiếp dưới quyền của
người do ông Mỗ quản lý, tức phục thuộc mức 2 vào ông Mỗ, Viết như sau:
Hỏi(X) ← Quản lý(X, Y), Quản lý(Y, “Mỗ”)
Như vậy, người ta không thể thể hiện yêu cầu tìm người phụ thuộc bậc n vào
ông Mỗ trong đại số quan hệ được. Dĩ nhiên câu hỏi tìm tên của nhân công làm việc dưới quyền của ông Mỗ, trực tiếp hay gián tiếp, không thể tạo được bằng đại số quan hệ hay bằng Datalog với các câu hỏi không đệ quy. Nguyên nhân là do người ta không biết ông Mỗ quản lý đến mức nào. Tuy nhiên người có thể tạo câu hỏi này trong Datalog dưới dạng câu hỏi đệ quy như sau:
e(X) ← Quản lý(X, “Mỗ”) e(X) ← Quản lý(X, Y), e(Y) Hỏi(X) ← e(X)
Chú ý: a)
Cách 1: Đối với những câu hỏi đệ quy người ta cũng có thể chuyển về câu hỏi không đệ quy bằng cách sử dụng ngôn ngữ tựa Pascal với một số lần hữu hạn các bước lặp. Việc lặp được thể hiện qua câu lệnh Repeat.
Điều kiện trong câu Until sẽ kiểm tra về tập hợp, như tính bằng nhau, bao nhau hay rỗng. Trong câu Until các quan hệ suy diễn được coi như các tập. Do vậy câu hỏi đệ quy trên có thể được viết lại như sau:
e’(X) ← Quản lý(X, “Mỗ”) Repeat
e(X) ← e’(X)
e’(X) ← Quản lý(X, Y), e(Y) Until e = e’
- Luật đầu tiên tìm nhân công mà ông Mỗ trực tiếp quản lý. Khi hoàn thành các luật trong vòng Repeat được đánh giá.
- Tại mỗi lần lặp, mức tiếp theo của nhân công được tìm và được bổ sung vào tập e.
- Thủ tục này kết thúc khi tập e = e’ (Khi không còn nhân công mới có thể được bổ sung vào e.). Mặt khác, do tập những người quản lý là hữu hạn.
Cách thực hiện: Theo dõi chu trình với các dữ liệu trong bảng khi chạy.
e’ = {Hoa, Lan, Mai} e = {Hoa, Lan, Mai}
e’ = {Hoa, Lan, Mai, Chén, Tích} e = {Hoa, Lan, Mai, Chén, Tích}
Cách 2: Ngoài cách làm như trên người ta có thể có cách làm khác mà vẫn đạt được kết quả như trên:
m(X, Y) ← Quản lý(X, Y)
m(X, Y) ← Quản lý(X, Z), m(Z, Y) Hỏi(X) ← m(X, “Mỗ”)
So sánh giữa cách 1 và cách 2:
Cách 1: Tìm ra các nhân công của ông Mỗ. Cách này cho phép tìm nhanh hơn.
Cách 2: Tìm tất cả quan hệ nhân công – người quản lý rồi chọn ra các cặp có tên người quản lý là Mỗ
b) Khác với câu hỏi không đệ quy, người ta có nhiều chiến lược đánh giá câu hỏi đệ quy như chiến lược đánh giá từ dưới – lên.
Để đánh giá câu hỏi đệ quy e được gọi là đánh giá thô. Tuy nó đơn giản những không mấy hiệu qủa trong số các chiến lược dưới – lên. Sự không hiệu quả là do khi người ta sử dụng luật đệ quy, tập e trước đó đã được sử dụng trong tính toán. Để hiệu quả hơn, người ta dùng đánh giá
nửa thô. Dưới đây chỉ các nhân công vừa được bổ sung trong lần lặp trước mới được luật xét đến.
Cách 11: i:=0
ei (X) ← Quản lý(X, “Mỗ”) Repeat
e(X) ← ei (X)
ei + 1(X) ← Quản lý(X, Y), ei (Y) i: = i +1 Until ei ⊆ e Cách 21: i:=0 mi (X, Y) ← Quản lý(X, Y) Repeat m(X, Y) ← mi (X, Y) mi + 1(X, Y) ← Quản lý(X, Z), mi (Z, Y) i: = i +1 Until mi ⊆ m Hỏi(X) ← Quản lý(X, “Mỗ”)
Lưu ý: Dù đã có phương pháp đánh giá tốt hơn đánh giá thô, người ta vẫn không đạt được hiệu quả như trong câu hỏi cho cùng kết quả trước đó. Cũng có nhiều kĩ thuật đảm bảo làm tinh kĩ thuật nửa thô.