Định nghĩa 2.5: Đồ thị ADG (Anmotated DTD Grraph) G là một cặp (V,E), trong đó V là một tập hữu hạn các phần tử, thuộc tính, và E là một quan hệ nhị phân trên V. Mỗi cạnh e E có nhãn là kiểu quan hệ lực lượng như ở phần 2.1.5.2.b. Mỗi đỉnh v V chứa các thông tin sau:
1) Bậc (indgree): Là số cạnh đi vào.
2) Kiểu (type): Chứa tên kiểu phần tử trong mô hình nội dung của DTD (như conf, paper).
3) Thẻ (tag): Lưu trữ giá trị cờ để chỉ một nút là phần tử hay thuộc tính (nếu là thuộc tính thì nó có chứa từ khoá thuộc tính như ID, IDFEF).
4) Trạng thái: Khi tìm kiếm theo chiều sâu, nếu nút được xét rồi thì có cờ “visited”, ngược lại là “not - visited”.
Hình 2.10: Đồ thị ADG biểu diễn ĐT trong ví dụ 2.9
Bảng 2.12. Quan hệ lực lượng và ràng buộc ngữ nghĩa tương ứng
Kiểu quan hệ lực lượng ADG không chỉ xem xét quan hệ giữa các phần tử và phần tử con của nó mà còn xét mối quan hệ giữa phần tử và thuộc tính. Ví dụ DTD < !ATTLIST X Y # IMPLIED Z #REQUIRED> có 2 kiểu quan hệ lực lượng là (0,1) giữa phần tử X và thuộc tính Y; (1,1) giữa phần từ X và thuộc tính Z. Ta có thể sử dụng quan hệ lực lượng minh hoạ trên ADG để tìm các ràng buộc ngữ nghĩa một cách hệ thống thông qua thuật toán findConstraints() và các kiểu ràng buộc ngữ nghĩa chính trong bảng 2.12.
Thuật toán findConstraints
Input: Nút v và w
Output: Kiểu ràng buộc giữa nút v và w
Switch edge (v,w) do Case type (0,1) v ->w Case type (1,1) W is not null: v ->w; v->> w Case type (0,N) /* empty*/ Case type (1,N) W is not null; v ->> w
Tuy nhiên, nếu muốn lược đồ quan hệ mới sinh có được ngữ nghĩa đúng thì các ràng buộc ngữ nghĩa trong XML phải được viết lại theo thuật ngữ của lược đồ quan hệ. Thao tác này được thực hiện bởi thuật toán rewiteConsstraints().
Thuật toán CPI – Constraints – preserving Inlining Algorithm
Thuật toán CPI thực hiện việc chuyển đổi lược đồ DTD sang lược đồ quan hệ bao gồm việc chuyển đổi các ràng buộc. Thuật toán CPI kết hợp với các thuật toán gộp lại ghép, findConstraints() và thuật toán rewriteConstraints().
Đầu tiên thuật toán sẽ xác định tất cả các nút đỉnh từ ADG. Sau đó, với mỗi nút đỉnh, thuật toán sẽ sinh ra một lược đồ bảng tương ứng bởi hybrid(). Thuật toán findConstraints() và rewriteConstraints() sẽ tìm thấy những ràng
buộc và chuyển sang thuật ngữ quan hệ. Thuật toán gộp lai ghép sẽ tìm kiếm theo chiều sâu trên ADG trong khi tìm kiếm các ràng buộc. Lược đồ kết quả sẽ là tổng hợp tất cả các lược đồ bảng và các ràng buộc về ngữ nghĩa.
Thuật toán rewiteConstraint
Input: Các ràng buộc ‟ theo khái niệm XML Output: Các ràng buộc theo khái niệm quan hệ
Switch‟ do Case X ->
If X được ánh xạ sang một thuộc tính X‟ trong lược đồ bảng A Then A [X‟] not null. (“CREATE TABLEA (....X‟ NOT NULL...)”)
Case X Y
If X và Y ánh xạ sang một thuộc tính X‟ và Y‟trong lược đồ bảng A và B theo viết lại điều đó như sau: A[X‟] B [Y‟]. (ví dụ, if Y là khoá chính của B, then “CRATE TABLE A (...FOREIGN KEY (X‟) REFERENCES B(Y‟)”. Else “CREATE TABLE A (...(X‟) CHECK (X‟ IN (SELECT Y‟ FROMB))...”
Case X ->X.Y
If X và Y ánh xạ sang cùng lược đồ bảng A (ví dụ khi Y không là nút đỉnh thì Y trở thành một thuộc tính của A) và Z là thuộc tính khoá của A
Then viết lại điều đó như sau: A [Z] -> A [Y]. (ví dụ “CREATE TABLE A (... UNIQUE (Y), PRIMARY KEY (Z)...)”)
Case X ->>X.Y
Hãy cho A là một bảng và Z là thuộc tính khoá của A và viết lại điều đó như sau: A[Z] ->> A [Y]. (ví dụ “CREATE TABLE B (... Y NOT NULL, PRIMảY KEY (Z)...)”)
Else
Hãy tạo bảng A và B, và Z là thuộc tính khoá của A và viết lại điều đó như sau: B[fk_A] A [Z]. (ví dụ “CREATE TABLE B (..FOREIGN KEY (fk –A) REFERENCES A()Z...)”)
Bảng 2.13 Lược đồ quan hệ của phần tử paper tham chiếu từ ví dụ 2.9
Thuật toán CPI
Input: Đồ thị chú thích DTD G = (V,E)
Output : Lược đồ quan hệ R
For mỗi v V do
Table _ def <- {}
Ifv.tag =‟element‟ then
add („root _ elm‟, table _ def); /* nơi bắt đầu*/ If v.indegree> 1 then
add („parent _ elm, table_def); /* trường hợp phần tử chung*/
add (concat („fk _ „, parent (v)), table _ def); W <- Adj [v]; w W
If bất kỳ w.tag =‟ID then add (w.type, table -def);
Else add („id‟, table _ def); /* sinh khoá chính bởi hệ thống*/
R<-R + hybrid (v, table _ def, ) Return R
Thuật toán hybrid
Input : Đỉnh v, tableDef table _ def, String attr_name
Output : Lược đồ quan hệ R
v.status<-„visited‟
For mỗi w Adj [v] do
If w.status =‟ not –visite‟then
‟ <- findConstraints (v,w); <- rewriteConstraints (‟) hybrid (w, table _ def, concat (attr – name, „_‟, w.type))
add (attr-name, table - def); R, <- table _def +
return R