XQuery - Generierung Christoph Böhm LN - Forschungsseminar Berlin, 17.01.2005
Agenda Tool Anforderungen XML Schema: Bsp und Parser XQuery: Bsp und Objektmodel Die Semantik einer graphischen XQuery Der S(elect)-P(roject)-Tree XSDTree SPTree XQuery Demo Visionen
Anforderungen 1. Lade XML Schema (aus Daten - später) 2. Anzeigen des Schemas 3. Auswahl der Zielstruktur (Umstrukturierungen - später) 4. Prädikate an den Knoten antragen 5. Definition einer XML Datei zur Ausführung 6. XQuery generieren XQuery generieren 7. XQuery ausführen
XML Schema Beispiel (1) sd:schema xmlns:xsd="http://www.w3.org/2001/xmlschema" elementformdefault="qualified"> xsd:element name="statisticsdb"> [... ] <xsd:complextype> <xsd:choice> <xsd:element name="citystatistics" minoccurs="0" maxoccurs="unbounded"> <xsd:complextype> <xsd:sequence> <xsd:element name="organization" minoccurs="0" maxoccurs="unbounded"> <xsd:complextype> <xsd:sequence> <xsd:element name="cid" type="xsd:string"/> <xsd:element name="cname" type="xsd:string" nillable="true" maxoccurs="unbounded"/> <xsd:element name="funding" minoccurs="0" maxoccurs="unbounded"> <xsd:complextype mixed="true"> [... ] </xsd:complextype> </xsd:element> </xsd:sequence> <xsd:attribute name="myattribute" type="xsd:string"/> </xsd:complextype> </xsd:element> [... ]
XML Schema Beispiel (2) <xsd:element name="funding" minoccurs="0" maxoccurs="unbounded"> <xsd:complextype mixed="true"> <xsd:all> <xsd:element name="gid" type="xsd:string"/> [... ] <xsd:element name= projectfk" type="xsd:string"/> </xsd:all> </xsd:complextype> </xsd:element> [... ] <xsd:element name="project" minoccurs="0" maxoccurs="unbounded"> <xsd:complextype> <xsd:all> <xsd:element name="namepk" type="xsd:string"/> [... ] </xsd:all> </xsd:complextype> </xsd:element> [... ] xsd:key name="pk3"> <xsd:selector xpath="./project"/> <xsd:field xpath="namepk"/> /xsd:key>... ] xsd:keyref name="fk1" refer="pk3"> <xsd:selector xpath="./funding"/> <xsd:field xpath="projectfk"/>
XML Schema Parser XML Schema Object Model (XSOM) By Kohsuke Kawaguchi (sun)
XML Schema Parser Visitor vereinfachter Baum zzgl. Informationen für XQueryGen: +-de +-hu +-mac +-hummer +-xquerygen +-logic +-xsparsing XSAbstractTreeNode XSAttribute XSComplexElement XSElement XSModelGroup XSParserWrapper XSSimpleElement XSText XSTreeNode isselected() getfather() getchildren() IsPredicateAllowed() getpredicate() hasselecteddescendants() IsLeaf() IsRoot() geticonname() visit( NodeVisitorIF visitor ) nullxstreenode()...
XQuery Beispiel - einfach <result> { for $i in document("statisticsdb.xml")/ statisticsdb/citystatistics/organization/funding let [... ] where [... ] order by [... ] return ( $i/id, $i/project ) } </result>
XQuery Beispiel - komplex <result> { for $i in doc("statisticsdb.xml")/statisticsdb/citystatistics/* where local-name($i) = 'organization' or local-name($i) = 'financial' return ( if ( local-name($i) = 'organization' ) then element {node-name($i)} { for $j in $i/* where local-name($j) = 'funding' return element {node-name($j)} { for $k in $j/* where local-name($k) = 'gid' return $k } } else (), if ( local-name($i) = 'financial' ) then element {node-name($i)} { for $l in $i/* where local-name($l) = 'aid' return $l } else () ) }
XQuery Objektmodel (1)
XQuery Objektmodel (2)
XQuery Objektmodel (3)
XQuery Objektmodel (4) r $x in doc(...xml")/[...] t $y := [...] ere [...] der by [...] turn [...]
Semantik einer Graphischen XQuery (1) Grundregeln: Möglich sind Selektionen und Projektionen. Alles was im Ergebnis erscheinen soll, muss markiert werden. Prädikate wirken immer auf die Ebene, auf der sie definiert worden sind. Attribute erscheinen im Ergebnis mit ihren umschließenden Tags. Das Ergebnis einer generierten XQuery erscheint in Document Order.
Semantik einer Graphischen XQuery (2)
Semantik einer Graphischen XQuery (3)
Semantik einer Graphischen XQuery (4)
S(elect)-P(roject)-Tree (1) Extrakt der Selektionen des XSDTrees Selection if ( local-name( $x0 ) = abc' ) then Name element {node-name($x0)} Simple Content $x0/text() Iteration for $x1 in $x0/... /* Filter where (local-name($x1) = xyz or... and...) Order order by... Auswahl eines XSNodes Name des Knotens in der Ausgabe Einfacher Inhalt des Knotens in der Ausgabe ( $x0, $x0/text(), $x0/@attribute ) Sequenz von XSNodes für die nächste Ebene von SPNodes Filter auf die Sequenz von XSNodes für die nächste Ebene von SPNodes Ordnung auf der Sequenz von XSNodes für die nächste Ebene von SPNodes
S(elect)-P(roject)-Tree (2) <result> { for $x0 in doc( "statistiken.xml" )/statisticsdb/ citystatistics/organization/* where local-name( $x0 ) = 'funding' return if ( local-name( $x0 ) = 'funding' ) then for $x1 in $x0/* where (local-name($x1)='proj' or local-name($x1)='faid') return ( if ( local-name( $x1 ) = 'proj' ) then $x1/text() else (), Selection if ( local-name( $x1 ) = 'faid' ) then Name $x1 else () Simple Content ) Iteration else () Filter } Order
S(elect)-P(roject)-Tree (3) lection: me: ple Content: ration: ter: der: result $i in doc("statisticsdb.xml")/statisticsdb/citystatistics/organization/* local-name( $i ) = 'funding' Selection: Name: Simple Content: Iteration: Filter: Order: local-name( $x0 ) = 'funding' $j in $i/* local-name( $j ) = 'proj or local-name( $j ) = 'faid' Selection: Name: Simple Content: Iteration: Filter: Order: local-name( $x2 ) = proj $j/text() Selection: local-name( $x2 ) = faid Name: Simple Content: $j Iteration: Filter:
XSDTree SPTree 32 sich teilweise überlappende Endkonfigurationen
XSDTree SPTree XQuery SDTree Rekursiver Algorithmus SPTree PTree Visitor XQuery
Demo Let s go...
Visionen / Folgende Schritte Simplify XQuery Gespeicherten XSDTree laden Prädikat Editor / Prädikat Evaluation User aufgrund Schemainformationen unterstützen XML Schema aus Daten berechnen Vorschlag für Joins anhand Key-KeyRefs Aggregationen / Gruppierungen Veränderung des Zielschemas XQuery Beispiel Ergebnis - Funktion
Noch Fragen?