praktisch)

Übung 5: XML Retrieval Lösung Aufgabe 1: XML Retrieval (theoretisch / praktisch) In dieser Übung wollen wir XML Retrieval auf einer relationalen Dat...
Author: Ina Salzmann
4 downloads 0 Views 85KB Size
Übung 5: XML Retrieval

Lösung

Aufgabe 1: XML Retrieval (theoretisch / praktisch) In dieser Übung wollen wir XML Retrieval auf einer relationalen Datenbank implementieren (siehe entsprechende Ansätze bei Textretrieval). Hierzu sei das folgende Beispiel XML Dokument gegeben. a) Für ein einfaches Boolesches Retrieval benötigen wir eigentlich nur 2 Tabellen: eine Tabelle mit allen Elementdaten (id, id des Vaterelements, der eindeutige XPath-Ausdruck im XML-Dokument und der 'label path', d.h. der Typ des Elements) und die Termtabelle (gibt an, welche Terme in welchen Elementen auftreten). Wir wollen hier aber bereits die Augmentierung berücksichtigen. Deshalb speichern wir die Augmentierungsgewichte in einer separaten Tabelle (siehe Grafik unten; ohne Query-Tabelle). Beim Einfügen eines Dokumentes werden Terme zuerst beim entsprechenden Element hinzugefügt (tf ist hier die Anzahl der Termvorkommen). Dann wird mit Hilfe der 'parent'-Beziehung und der Gewichte die tf-Werte der Vorfahrelemente angepasst (bis hinauf zur Wurzel). Mit anderen Worten: jedes Termvorkommen wird mehrfach in die Datenbank geschrieben; dies kann mit einem SAX-Parser sehr einfach realisiert werden (man muss sich zu jeder Zeit die Vorfahrelemente merken).

Eine mögliche Implementierung könnte wie auf der nächste Seite aussehen. Beachte: die konkrete SQL Syntax kann von Datenbank zu Datenbank leicht variieren (besonders die Datentypen). Alle Skripte liegen auf dem WebServer der Vorlesung. create table Augmentation ( parent VARCHAR(1024), child VARCHAR(1024), weight FLOAT ); create table XMLElement ( parent INTEGER REFERENCES XMLElement(elid), elid INTEGER PRIMARY KEY, xpath VARCHAR(1024), labelpath VARCHAR(1024) );

Übung 5: XML Retrieval

Lösung

Aufgabe 1: XML Retrieval (theoretisch / praktisch) create table XMLIndex ( elid INTEGER REFERENCES XMLElement(elid), term VARCHAR(128), tf FLOAT, PRIMARY KEY (elid,term) ); create table XMLQuery ( term VARCHAR(128) PRIMARY KEY, tf FLOAT ); insert into Augmentation VALUES('/MANAGER','/MANAGER/NAME',0.2); ... insert into XMLElement VALUES(NULL,10,'/MANAGER[1]','/MANAGER'); insert into XMLElement VALUES(10,0,'/MANAGER[1]/NAME[1]','/MANAGER/NAME'); ... insert into XMLIndex VALUES(0,'janine',1); ... /* update der parent Elemente */ insert into XMLIndex select e.parent,i.term,sum(i.tf*a.weight) from XMLIndex i,XMLElement e,Augmentation a where i.elid=e.elid AND e.labelpath=a.child group by e.parent,i.term; /* Anfrage Auswertung */ delete from XMLQuery; insert into XMLQuery VALUES('the',1); insert into XMLQuery VALUES('money',1); select e.elid,e.xpath from XMLElement e,XMLIndex i,XMLQuery q where i.term=q.term AND i.elid=e.elid AND e.labelpath='/MANAGER' group by e.elid,e.xpath having count(i.term)=(select count(*) from XMLQuery);

Übung 5: XML Retrieval

Lösung

Aufgabe 1: XML Retrieval (theoretisch / praktisch) b) Analog zum Trick mit der Query-Tabelle soll eine zusätzliche Tabelle (XMLSelection) die Elemente aufzählen, welche die 'harten' Prädikate überhaupt erfüllen. Das Vorgehen ist dann wie folgt: zuerst bestimmt man die Elemente, welche den 'harten' Bedingungen entsprechen (z.B. mit Hilfe eines XQuery Evaluators). Gewisse Prädikate können auch sehr einfach mit Hilfe der 'label path' Angaben innerhalb der Tabelle XMLElement evaluiert werden (siehe auch Anfragebeispiel unten). Dann benutzt man die neue Tabelle XMLSelection, um die Elemente zu eliminieren, welche die 'harten' Prädikate nicht erfüllen (mit Hilfe eines Joins). Eine mögliche Implementierung könnte wie folgt aussehen: create table XMLSelection ( elid INTEGER REFERENCES XMLElement(elid) ); /* Anfrage Auswertung */ delete from XMLQuery; insert into XMLQuery VALUES('the',1); insert into XMLQuery VALUES('money',1); delete from XMLSelection; insert into XMLSelection select elid from XMLElement where labelpath='/MANAGER/REVIEW' or labelpath='/PROJECT'; select from where group having

e.elid,e.xpath XMLElement e,XMLIndex i,XMLQuery q,XMLSelection s i.term=q.term AND i.elid=e.elid AND i.elid=s.elid by e.elid,e.xpath count(i.term)=(select count(*) from XMLQuery);

Übung 5: XML Retrieval

Lösung

Aufgabe 1: XML Retrieval (theoretisch / praktisch) c) Vektorraumretrieval benötigt Statistiken über die Elemente und Termvorkommen. Diese können entweder global sein (d.h. für alle Anfragen gültig) oder Anfrage abhängig. Für die Aufnahme der Statistiken brauchen wir eine neue Tabelle XMLTerm, welche je nach Ansatz unterschiedlich ausschaut. Die Berechnung mit globalen Statistiken erfolgt dann wie folgt: create table XMLTerm ( term VARCHAR(128) PRIMARY KEY, ief FLOAT ); insert into XMLTerm select term, log(1.0*(select count(*) from XMLElement)/count(*)) from XMLIndex group by term; /* Anfrage Auswertung */ select e.elid,e.xpath,SUM(q.tf * t.ief * i.tf * t.ief) from XMLElement e,XMLIndex i,XMLQuery q, XMLTerm t,XMLSelection s where q.Term=t.Term AND i.Term=t.Term AND i.elid=e.elid AND i.elid=s.elid group by e.elid,e.xpath order by 3 desc; Bei gloablen Statistiken muss das insert-Statement nicht für jede Anfrage neu ausgeführt werden. Anders beim Retrieval mit Anfrage abhängigen Statistiken: basierend auf den ausgewählten Elementen (in XMLSelection) müssen die ief-Werte neu bestimmt werden. Hierzu brauchen wir keine XMLTerm-Tabelle mehr, sondern erweitern die Tabelle XMLQuery um ein Feld ief. Genau genommen müssen wir nämlich nur die Statistiken der Anfrageterme bestimmen: create table XMLQuery ( term VARCHAR(128) PRIMARY KEY, tf FLOAT, ief FLOAT ); /* Anfrage Auswertung */ delete from XMLQuery; insert into XMLQuery VALUES('this',1,0); insert into XMLQuery VALUES('project',1,0); insert into XMLQuery VALUES('costs',1,0); insert into XMLQuery VALUES('money',1,0);

Übung 5: XML Retrieval

Lösung

Aufgabe 1: XML Retrieval (theoretisch / praktisch) delete from insert into select where OR

XMLSelection; XMLSelection elid from XMLElement labelpath='/MANAGER/REVIEW' labelpath='/PROJECT';

update XMLQuery set ief=(select log(1.0*(select count(*) from XMLSelection)/count(*)) from XMLIndex i,XMLSelection s where i.elid=s.elid AND i.term=XMLQuery.term); select from where group

e.elid,e.xpath,SUM(q.tf * q.ief * i.tf * q.ief) XMLElement e,XMLIndex i,XMLQuery q,XMLSelection s q.Term=i.Term AND i.elid=e.elid AND i.elid=s.elid by e.elid,e.xpath order by 3 desc;

Die Berechnung der Statistiken kann dadurch beschleunigt werden, in dem man nur Statistiken auf Pfadebene verwendet. Dabei müssen wir uns die Elementhäufigkeiten der Terme und die Anzahl Elemente für jeden 'label path' merken. Die beiden Tabellen können wie folgt aufgefüllt werden (genauso wie bei den globalen Statistiken müssen diese Tabelle nicht jedes Mal neu berechnet werden): create table XMLTerm ( labelpath VARCHAR(600), term VARCHAR(128), ef FLOAT ); create table XMLPath ( labelpath VARCHAR(600) PRIMARY KEY, cnt FLOAT ); insert into XMLTerm select from where group insert into XMLPath select from

e.labelpath,i.term,count(*) XMLIndex i,XMLElement e i.elid=e.elid by e.labelpath,i.term; labelpath,count(*) XMLElement group by labelpath;

Übung 5: XML Retrieval

Lösung

Aufgabe 1: XML Retrieval (theoretisch / praktisch) Die Berechnung der ief-Werte für die Anfrageterme sieht dann wie folgt aus (die Evaluation einer Anfrage bleibt gleich): update XMLQuery set ief=( select log(1.0*(select sum(cnt) from XMLPath where labelpath='/MANAGER/REVIEW' OR labelpath='/PROJECT') /sum(ef)) from XMLTerm t where t.term=XMLQuery.term AND (t.labelpath='/MANAGER/REVIEW' OR t.labelpath='/PROJECT'));