2.4 Truy vấn trong tích hợp dữ liệu
2.4.2.3. Các thuật toán tính toán lại
Cho câu truy vấn Q và một tập các khung nhìn V1,…,Vn, để viết lại câu Q dưới dạng các Vi, chúng ta phải thực hiện tìm kiếm trên tất cả các trường hợp liên kết có thể của m hoặc ít nhất là các phần tử khung nhìn (m là số các mục con trong truy vấn). Các thuật toán được đưa ra để tránh tình huống phải tìm kiếm tất cả các trường hợp.
Thuật toán Bucket (Information Manifold)
Ý tưởng chính trong thuật toán Bucket là chúng ta có thể giảm số các câu truy vấn viết lại cần quan tâm nếu chúng ta xem xét mỗi một mục con trong truy vấn tách biệt nhau và xác định khung nhìn nào có mối liên hệ với mỗi mục con (trang 34 tài liệu [6]). Cho câu truy vấn Q, thuật toán Bucket tìm câu viết lại của Q trong 2 bước:
(1) Thuật toán tạo một bucket cho từng mục con trong Q mà ràng buộc với khung nhìn, đó là liên hệ tới câu trả lời cho mục con đó.
(2) Thuật toán cố gắng tìm thấy một câu truy vấn viết lại mà liên hệ với các câu truy vấn, và trên tất cả các bucket. Với mỗi khả năng sự lựa chọn của thành phần trong mỗi bucket, thuật toán kiểm tra khi nào thì kết quả kết nối nằm trong câu truy vấn Q hoặc khi nào nó có thể trở thành bao hàm nếu các thuộc tính thêm vào được thêm vào câu viết lại. Câu viết lại được thêm vào trong kết quả. Do đó, kết quả của thuật toán Bucket là tập một liên kết các câu viết lại.
Ví dụ đơn giản sau sẽ thể hiện hoạt động của thuật toán như thế nào
Ví dụ:
Có ba nguồn dữ liệu S1, S2 và S3. S1 chứa thông tin về các xe sản xuất sau năm 1990. S2 chứa các xe được bán bưởi người có tên "ACME". S3 chứa thông tin đánh giá về xe. Các mối liên hệ trong lược đồ toàn cục như sau:
Trang 55
CAR(vin, status)
MODEL(vin, model, year) SELLS(dealer_name, vin, price) REVIEW(vin, review)
Tiếp theo là các định nghĩa khung nhìn trên các nguồn dữ liệu: S1(vin, status, model, year) : − CAR(vin, status),
MODEL(vin, model, year), year _ 1990 S2(vin, status, model, price) : − CAR(vin, status),
MODEL(vin, model, year), SELLS(dealer name, vin, price), dealer name = "ACME"
S3(vin, review) : − REVIEW(vin, review)
Giả sử chúng ta đang tìm một chiếc xe sản xuất trước năm 1990, cùng với thông tin đánh giá và thời gian được bán. Chúng ta đưa ra một câu truy vấn trên hệ thống trung gian:
Q(vin, dealer, review) : − CAR(vin, status), MODEL(vin, model, year), SELLS(dealer name, vin, price), REVIEW(vin, review), year < 1990, status = "used"
Chúng ta sử dụng kí tự ban đầu của mỗi trường để dễ dàng thể hiện. Bước đầu tiên của thuật toán Bucket xây dựng tập bucket cho mỗi một mục con trong Q:
CAR(V, S) MODEL(V, M, Y) SELLS(D, V, P) REVIEW(V, R) S2(V, S, M', P') S2(V, S', M, P') S2(V, S', M', P) S3(V, R)
Trang 56
Chúng ta không chèn S1 vào bucket CAR(V,S) và MODEL(V,S) vì ràng buộc trên năm trong câu truy vấn. S1 chỉ chứa các xe sản xuất sau năm 1990, trong khi đó truy vấn yêu cầu các xe sản xuất trước năm 1990, do đó S1 không tham gia vào truy vấn.
Bước hai của thuật toán là chọn một khung nhìn từ mỗi bucket và kết nối chúng vào câu truy vấn mới. Trong ví dụ, chúng ta đã có một đầu vào cho mỗi bucket, ở đây sẽ tạo thành một liên kết trên các nguồn dữ liệu.
Chúng ta sẽ thu được một câu truy vấn viết lại mới dưới dạng các định nghĩa khung nhìn:
Q'(vin, dealer, review) : − S2(vin, status, model, price), S3(vin, review), year < 1990, status = "used"
Ở đây chúng ta loại trừ hai ánh xạ dư thừa tới S2 và chúng ta cũng đặt một ràng buộc mở rộng trên các thuộc tính year và status kể từ lúc không có hai thuộc tính này, Q’ có thể không phải là bao hàm trong Q.
Thuật toán Inverse-Rules (InfoMaster)
Điểm chính của thuật toán này là xây dựng tập các luật nhằm đảo ngược các định nghĩa khung nhìn. Có nghĩa là, các thuật toán làm thế nào để ước tính một bộ cho các liên hệ trong lược đồ trung gian từ các bộ của các khung nhìn. Quá trình này như việc thu được các định nghĩa GAV từ các định nghĩa LAV. Mặt khác, trên thực tế chúng ta không viết lại câu truy vấn, nhưng chúng ta viết lại các định nghĩa khung nhìn do đó câu truy vấn ban đầu sẽ dễ dàng được trả lời dựa trên các luật được viết lại (trang 36 tài liệu [6]).
Một luật đảo ngược được xây dựng cho tất cả các mục con trong thân của khung nhìn. Khi đảo ngược các định nghĩa khung nhìn, các biến liên quan xuất hiện
Trang 57
trong định nghĩa khung nhìn được ánh xạ bằng cách sử dụng hàm Skolem (trang 36 tài liệu [6]). Việc này đảm bảo tính tương đương giữa các biến không bị mất đi.
Ví dụ:
Dựa trên định nghĩa khung nhìn cho S1 trong ví dụ trước. S1(vin, status, model, year) : − CAR(vin, status),
MODEL(vin, model, year), year 1990
Thuật toán Inverse-Rulesđảo ngược định nghĩa khung nhìn này bằng cách viết một qui tắc đảo ngược cho từng mục con trong định nghĩa khung nhìn, kết quả:
CAR(f1(V, status, model, year), status) : − S1(V, status, model, year)
MODEL(f1(V, status, model, year), model, year) : −S1(V, status, model, year) Để giải quyết vấn đề trên, thuộc tính vin được thay thế bởi hàm Skolem f1, hàm này lấy tất cả các thuộc tính của khung nhìn làm đầu vào. Thuộc tính tương ứng với vin được thay thế bởi biến V. Lý do mà chúng ta xem thuộc tính vin như là một thuộc tính đặc biệt là do nó được dùng chung giữa CAR và MODEL trong định nghĩa khung nhìn. Một giá trị vin trong CAR cũng có thể tồn tại trong MODEL và nằm trong khung nhìn S1. f1 đảm bảo rằng chúng ánh xạ tới cùng một giá trị.
Việc viết lại câu truy vấn Q sử dụng tập khung nhìn V là một chương trình datalog, nó bao gồm tập luật đảo ngược V và câu truy vấn Q. Dưới đây chúng ta sẽ chỉ ra làm cách nào một câu truy vấn được đánh giá khi sử dụng các luật này.
Q(vin) : − CAR(vin, status), MODEL(vin, model, 2000) Giả thiết nguồn dữ liệu là S1 chứa các dữ liệu sau:
S1 = {(1, "used", "Honda", 2000), (2, "new", "Toyota", 2001), (3, "used", "Subaru", 2000)}
Trang 58
{CAR(f1(1, "used", "Honda", 2000), "used"),
CAR(f1(2, "new", "Toyota", 2001), "new"),
CAR(f1(3, "used", "Subaru", 2000), "used"),
MODEL(f1(1, "used", "Honda", 2000), "Honda", 2000),
MODEL(f1(2, "new", "Toyota", 2001), "Toyota", 2001),
MODEL(f1(3, "used", "Subaru", 2000), "Subaru", 2000)}
Khi Q được ước tính trên các bộ này, chúng ta sẽ thu được kết quả là {1,3}.
Thuật toán MiniCon.
Thuật toán MiniCon là một phiên bản nâng cấp của thuật toán Bucket. Như trong thuật toán Bucket, có hai bước: tính toán các bucket (cho từng mục con trong câu truy vấn), và sau đó tính toán việc viết lại sử dụng các bucket. Ngoài ra, thuật toán MiniCon tâp trung vào sự tương tác của các biến trong câu truy vấn và trong các định nghĩa khung nhìn để cắt bớt một số khung nhìn được đưa vào trong các bucket. Do đó, số lượng các khung nhìn cần xem xét trong bước viết lại sẽ giảm đi, hơn nữa sẽ làm giảm số lượng kết hợp hợp cần kiểm tra (trang 37 tài liệu [6]).
Ví dụ:
Dựa trên định nghĩa khung nhìn và câu truy vấn
S1(vin, status, model, year) : − CAR(vin, status), MODEL(vin, model, year) S2(vin, status, model, price) : − CAR(vin, status),MODEL(vin, model, year),
SELLS(dealer name, vin, price) S3(vin, review) : − REVIEW(vin, review)
Q(vin, dealer, review) : − CAR(vin, status), MODEL(vin, model, year), SELLS(dealer name, vin, price), REVIEW(vin, review)
Trang 59
Thuật toán Bucket sẽ đặt S1 vào các bucket của CAR và MODEL. Tuy nhiên, S1 không được sử dụng trong việc viết lại Q vì các lý do: Q yêu cầu kết nối trên SELLS và REVIEW. Để sử dụng S1, nó phải chứa cả SELLS và REVIEW hoặc nó phải có các biến tương ứng trong phần đầu vì thế nó có thể được kết nối với các khung nhìn khác chứa SELLS và REVIEW. S1 phải có thuộc tính vin để kết nối SELLS và REVIEW trên thuộc tính này nằm trong các khung nhìn khác. Tuy nhiên, phần đầu của S1 chỉ chứa model và year. Do đó chúng ta sử dụng S1 để viết lại. Không có yêu cầu nào đặt trong bucket của các mục con CAR và MODEL. S2 sẽ nằm trong các bucket của CAR, MODEL và SELLS, còn S3 nằm trong bucket của REVIEW.
Câu truy vấn mới sẽ là:
Q'(vin, dealer, review) : − S2(vin, status, model, price), S3(vin, review)
Với sự lược bỏ S1 trong bước xây dựng bucket, chúng ta chỉ cần kiểm tra ít hơn các khung nhìn kết hợp để viết Q’ nằm trong Q.