Docstoc

Xquery

Document Sample
Xquery Powered By Docstoc
					                         XQuery

Kielen määrittely
Vertailu relaatiotietokantaan
XQueryn käsitteitä ja kielen toiminta
FLWOR ForLetWhereOrderbyReturn
Esimerkki
XML Query Use Cases kyselyjä
                         XQuery
   XQuery ei ole vielä valmis eikä sen määrittely ole
    saavuttanut suositustasoa
     – XQuery 1.0: An XML Query Language
        http://www.w3.org/TR/xquery/
    – XQuery 1.0 and XPath 2.0 Data Model
        http://www.w3.org/TR/query-datamodel/
    – XQuery 1.0 and XPath 2.0 Functions and Operators
        http://www.w3.org/TR/xquery-operators/
    – Useita muita dokumentteja
                        XQuery
   liittyy läheisesti seuraaviin määrityksiin
     – XML
     – XML Schema
     – XSLT
     – XPath (XQueryn määritellään olevan XPath –
        suosituksen laajennus)
     Relaatiokanta vs. XML -dokumentti
Relaatiokanta                   XML -dokumentti
säännöllinen rakenne ja         heterogeeninen sisältö ja ei
repositori on olemassa          ole olemassa repositoria

sarakkeet ovat atomisia         elementit ovat sisäkkäisiä


taulun rivissä ei järjestystä   elementtien järjestys on
(relaatiomallissa)              olennaista

puuttuva tieto on rivissä       elementti voi puuttua
arvona NULL                     kokonaan
                             XQuery
   XQuery Working Groupin tarkoitus on luoda joustava kyselykieli

    - saadaan tietoa haettua dokumenteista
    - luodaan yhteys tietokantojen ja www-dokumenttien välille
    - lopullinen tavoite: mahdollistetaan xml- dokumenttien käsittely
       tietokantamaisesti

    – myöhemmin mahdollisesti määritellään kieleen myös
      päivitysominaisuus
                   XQuery tietomalli
   XQuery -kielen syöttö- ja tulostus määritellään
    tietomallin (data model) avulla
     – malli perustuu peräkkäisten alkioiden eli jonon
       käsitteeseen
                                   Jono
   jonon (sequence) määritellään muodostuvan järjestetystä
    joukosta, jossa on nollasta useaan alkiota (item)
   alkio voi olla joko solmu (node) tai perustietoalkio,
    jonka tyyppi on XML Scheman määrittelemä
    perustietotyyppi
     – merkkijono, kokonaisluku, desimaaliluku,
       päivämäärä, ...

    – esimerkki numerojonosta: 1,2,3,6,9
                          Solmu
   Solmu on jokin seuraavista seitsemästä
     – elementti
     – attribuutti
     – teksti
     – dokumentti
     – kommentti
     – PI
     – nimiavaruussolmu
            Dokumentti tuotteet.xml ja tarjoukset.xml
<tuotteet>                            <tarjoukset>
 <tuote status="kaupan">               <tarjous>
  <numero>123</numero>                  <asiakas>1420</asiakas>
  <myyja>1002</myyja>                   <tuote>123</tuote>
  <kuvaus>Hyvä taskulamppu</kuvaus>     <tarjoushinta>1.40</tarjoushinta>
  <minihinta>1.00</minimihinta>        </tarjous>
  <loppupvm>2003-06-01</loppupvm>      <tarjous>
 </tuote>                               ....
 <tuote status="kaupan">
 ....                                  </tarjous>
                                       <tarjous>
 </tuote>                               <asiakas>1210</asiakas>
</tuotteet>                             <tuote>123</tuote>
                                        <tarjoushinta>1.70</tarjoushinta>
                                       </tarjous>
Tietomalli           D    tuotteet.xml

                     E    tuotteet

                                             tuote
       tuote   E      A   status             E       A



   E           E     E        E          E



   T           T     T        T          T
numero     myyja kuvaus minimihinta loppupvm
      Uusien elementtien muodostus

   XQUERY kieli tuo XPATH-ilmaisuihin nähden
    lisää ominaisuuksia, sillä kyselykielellä voidaan
    muodostaa myös uusia elementtejä.
   XPATH -kieli voi käsitellä vain olemassa olevia
    elementtejä !
      Uusien elementtien muodostus

   Luodaan seuraavassa elementti
     – jos teksti on osa XQuery -kielisessä ohjelmassa, se luo
       uuden elementin esimerkiksi kyselyn tuloksena
       syntyvään dokumenttiin.

        <korkein_tarjous status="avoin">
          <numero>123</numero>
          <tarjottu_hinta>1.70</tarjottu_hinta>
        </korkein_tarjous>
       Uusien elementtien muodostus
   Jos halutaan luoda sisällöltään muuttuvia elementtejä, joudutaan
    muuttamaan menetelmää

          <korkein_tarjous status={”$s”}>
            <numero>{$t}</numero>
            <tarjottu_hinta> {max($tarjoukset[tuote = $e]/tarjoushinta)}
            </tarjottu_hinta>
          </korkein_tarjous>

   muuttujille $s, $t, $tarjoukset täytyy asettaa arvot, ennen kuin elementtien
    muodostus onnistuu
                             XQuery kielestä
XQuery -kieli sisältää seuraavia perusrakenteita:

1. polkumääritys
             XPath

2. elementin määritys
             XQueryn ohjelmien tuloksena syntyy uusia elementtejä ja kielessä on
              mekanismi niiden luomiseen

3. FLWR lauseet
          FOR, LET, WHERE ja RETURN
           lauseiden avulla esimerkiksi generoidaan esimerkiksi uusia elementtejä
                        XQuery kielestä
4. operaattorit ja funktiot
     – operaattorita ovat +, -, *, /, div, mod,
     – funktioita on iso joukko: päivämääräfunktioita, min, max, avg, count
               katso http://www.w3.org/TR/xquery-operators/


     – vertailuoperaattorit
               <, <=, >, >=, !=


5. ehdolliset määritykset
           if (ehto)
             then ...
           else ...
                       XQuery kielestä
6. määrälliset määritykset
     – every, some: esimerkki
          every $tuote in //tuote satisfies $tuote/@status
          (lause on tosi, jos kaikilla tuote-elementeillä on status-attribuutti)

          some $tuote in //tuote satisfies $tuote/@status
          (lause on tosi jos ainakin yhdellä tuote- elementillä on status-attribuutti)

7. tietotyypin testaus- tai muokkausmääritykset
      – mahdollisuus muuttaa tietotyyppejä toisiksi ja kysyä jonkin muuttujan
         tietotyyppiä. Lisäksi on mahdollista omien tietotyyppien luonti
                           Kyselyesimerkki Q1
Q1:
     Tee lista, jossa on tuotenumero ja tuotekuvaus niistä tuotteista, jotka ovat tällä hetkellä
      kaupattavana, joiden kuvaus sisältää tekstin “Bicycle” ja lajittele lista
      tuotenumerojärjestykseen.



     Katso esimerkkitaulut osoitteesta

            http://www.w3.org/TR/xmlquery-use-cases/#rdb
                        Kyselyesimerkki Q1
<result>
 {
   for $i in document("items.xml")//item_tuple
   where $i/start_date <= current-date()
    and $i/end_date >= current-date()
    and contains($i/description, "Bicycle")
   order by $i/itemno
   return
      <item_tuple>
         { $i/itemno }
         { $i/description }
      </item_tuple>
 }
</result>
                      Kyselyesimerkki Q1
<result>
  <item_tuple>
     <itemno>1003</itemno>
     <description>Old Bicycle</description>
  </item_tuple>
  <item_tuple>
     <itemno>1007</itemno>
     <description>Racing Bicycle</description>
  </item_tuple>
</result>
         XQuery kielen sääntöjä


• kieli on case sensitive
• avainsanat kirjoitetaan lower case
• kommentti {-- --}
       XQuery kielen lausekkeet

• literaalivakiot, esimerkkejä
      • integer 47
      • decimal 4.7
      • string "47" tai '47'

• kieli sisältää joitain konstruktoreja, esimerkiksi
     • date("2003-05-06")

• sulkujen käyttö ja aritmeettiset lausekkeet
     • (2+4)*5
       XQuery kielen lausekkeet

• jono, alkiot erotetaan pilkulla
         • 1,2,3
         • (1,2,3)
         • 1 to 3
       XQuery kielen lausekkeet

• XQuery -kielen muuttujanimi alkaa $-merkillä

     • esimerkiksi

        let $start := 1, $stop :=3
        return $start to $stop
            XQuery kielen lausekkeet

• Predikaatit
  • predikaattilausekkeet on hakasuluissa, ja niiden
     avulla valitaan jonoon tulevia elementtejä

•   Ilmaisussa
       document("tuotteet.xml"/*/tuote[myyja="1002"]/kuvaus

       on predikaatti fraasi myyja=“1002"
       XQuery kielen lausekkeet

• Jos tuote -solmulla on minimihinta -lapsisolmu,
  niin voidaan tehdä valinta (filterointi)

          tuote[minimihinta > 1000]

    mukaan valitaan ne elementit. jotka täyttävät ehdot

• Jos elementtejä ei löydy, niin tietoja ei tule
  käsitelyyn
       XQuery kielen lausekkeet

• Vertailuoperaattoreista HUOM

• =, !=, >, >=, <, <= valitsevat mukaan edellisessä
  kohdassa ne tuote-elementit, joilla vähintää yksi
  minimihinta -lapsisolmu, joka täyttää ehdon

• eq, ne, lt,le, gt, ge operaattorit valitsevat, jos
  täsmälleen yksi ehdot täyttävä lapsisolmu on
  olemassa, jos niitä on useampia, niin tulee virhe
           XQuery kielen lausekkeet
Solmujen vertailu

   •   is ja isnot
          • ($s1 is $s2) on tosi jos molemmat muuttujat
              ovat sidotut täsmälleen samaan solmuun

   • <<
          • ($s1 << $s2) on tosi, jos $s1 solmu esiintyy
            dokumentissa ennen solmua $s2
           XQuery kielen lausekkeet
Negaatio
• not

esimerkki, valitaan ne tuote -elementit, jotka eivät sisällä
   minimihinta elementtiä

tuote[not(minimihinta)]
                                  Esimerkki
   Käytetään seuraavassa esimerkkinä dokumentissa
     XML Query Use Cases
     W3C Working Draft 15 November 2002
         http://www.w3.org/TR/xmlquery-use-cases/
         olevaa kohtaa Use Case R

   esimerkki muodostuu kolmesta dokumentista, jotka seuraavassa esitetään
    relaatiokantamuodossa
     – USERS ( USERID, NAME, RATING )
     – ITEMS ( ITEMNO, DESCRIPTION, OFFERED_BY, START_DATE,
                           END_DATE, RESERVE_PRICE )
     – BIDS ( USERID, ITEMNO, BID, BID_DATE )
                          Esimerkki

   Esimerkissämme käytettävien dokumenttien DTD -
    kuvaukset ovat seuraavat:
<!DOCTYPE users [
  <!ELEMENT users   (user_tuple*)>
  <!ELEMENT user_tuple (userid, name, rating?)>
  <!ELEMENT userid (#PCDATA)>
  <!ELEMENT name    (#PCDATA)>
  <!ELEMENT rating (#PCDATA)>
]>
                            Esimerkki
<!DOCTYPE items [
  <!ELEMENT items         (item_tuple*)>
  <!ELEMENT item_tuple    (itemno, description, offered_by,
                           start_date?, end_date?, reserve_price? )>
  <!ELEMENT   itemno      (#PCDATA)>
  <!ELEMENT   description (#PCDATA)>
  <!ELEMENT   offered_by (#PCDATA)>
  <!ELEMENT   start_date (#PCDATA)>
  <!ELEMENT   end_date    (#PCDATA)>
  <!ELEMENT   reserve_price (#PCDATA)>
]>

<!DOCTYPE bids [
  <!ELEMENT bids        (bid_tuple*)>
  <!ELEMENT bid_tuple   (userid, itemno, bid, bid_date)>
  <!ELEMENT userid      (#PCDATA)>
  <!ELEMENT itemno      (#PCDATA)>
  <!ELEMENT bid         (#PCDATA)>
  <!ELEMENT bid_date    (#PCDATA)>
]>
                          Sanastoa
users = käyttäjät (asiakkaat)
items = tuotteet (huutokaupattavat esineet)
bids = tarjoukset (huutokauppahuudot)


item number = tuotenumero
description = tuotekuvaus
rate = luotettavuuden arvo
reserve price = alin hyväksyttävä hinta
bicycle = polkupyörä
tricycle = kolmipyörä
                  Esimerkki (users)

<users>
   <user_tuple>
         <userid>U01</userid>
         <name>Tom Jones</name>
         <rating>B</rating>
   </user_tuple>
…...
                       Esimerkki (items)
<items>
    <item_tuple>
          <itemno>1001</itemno>
          <description>Red Bicycle</description>
          <offered_by>U01</offered_by>
          <start_date>1999-01-05</start_date>
          <end_date>1999-01-20</end_date>
          <reserve_price>40</reserve_price>
    </item_tuple>

…….
                       Esimerkki (bids)
<bids>
    <bid_tuple>
          <userid>U02</userid>
          <itemno>1001</itemno>
          <bid>35</bid>
          <bid_date>1999-01-07</bid_date>
          </bid_tuple>
    <bid_tuple>

…….
         Esimerkin tiedot

USERS
USERID   NAME           RATING
U01      Tom Jones      B
U02      Mary Doe       A
U03      Dee Linquent   D
U04      Roger Smith    C
U05      Jack Sprat     B
U06      Rip Van Winkle B
                                Tiedot
ITEMS
ITEMNO DESCRIPTION      OFFRD    START_DATE      END_DATE         RS_PRICE

1001   Red Bicycle      U01      1999-01-05      1999-01-20          40
1002   Motorcycle       U02      1999-02-11      1999-03-15         500
1003   Old Bicycle      U02      1999-01-10      1999-02-20          25
1004   Tricycle         U01      1999-02-25      1999-03-08          15
1005   Tennis Racket    U03      1999-03-19      1999-04-30          20
1006   Helicopter       U03      1999-05-05      1999-05-25       50000
1007   Racing Bicycle   U04      1999-01-20      1999-02-20         200
1008   Broken Bicycle   U01      1999-02-05      1999-03-06          25




                                      OFFRD    = OFFERED_BY
                                      RS_PRICE = RESERVED_PRICE
                Tiedot
BIDS
USERID ITEMNO    BID   BID_DATE
U02       1001    35 1999-01-07
U04       1001    40 1999-01-08
U02       1001    45 1999-01-11
U04       1001    50 1999-01-13
U02       1001    55 1999-01-15
U01       1002 400 1999-02-14
U02       1002 600 1999-02-16
U03       1002 800 1999-02-17
U04       1002 1000 1999-02-25
U02       1002 1200 1999-03-02
U04       1003    15 1999-01-22
U05       1003    20 1999-02-03
U01       1004    40 1999-03-05
U03       1007 175 1999-01-25
U05       1007 200 1999-02-08
U04       1007 225 1999-02-12
                      Kyselyn rakenne
   Tee lista, johon tulee kuvaus niistä tuotteista, joita U01 tarjoaa
    myytäväksi.

     <tulos>
     {
      for $b in document("items.xml")/items/item_tuple
      where $b/offered_by = "U01"
      return
        <kuvaus>
        { $b/description }
        </kuvaus>
     }
     </tulos>
            Kyselyn rakenne
<tulos>       XQueryn palauttaman
...           dokumentin alku- ja lopputagit
...
</tulos>



  {            XQuery-ohjelma rajataan
  .......      aaltosuluilla
  }
                 Kyselyn rakenne
  for $b in document("items.xml")/items/item_tuple
   where $b/offered_by = "U01"
                valitaan seuraavat elementit vuorotellen muuttujan $b
for $b          arvoiksi

                                        haetaan elementit dokumentista
in document("items.xml")                items.xml

                                         valitaan vuorollaan kukin items_tuple
/items/item_tuple                        elementtisuhteelliseksi osoitteeksi

where              lauseessa on where-ehto

                      haetaan $b/offered_by elemetin arvo
$b/offered_by         (kukin items_tuple elementti vuorollaan

                    verrataan, onko haettu arvo ”U01”. Jos on, otetaan elementti
= "U01"             jatkokäsittelyyn ja jos ei ole , niin siirrytään seuraavaan
                    elementtiin
                     Kyselyn rakenne
       return
         <kuvaus>
         { $b/description }
         </kuvaus>
                                     palautetaan
 return
                                      palautettavan elementin alku- ja
 /<kuvaus>
                                      lopputagi
  ..
 </kuvaus>

                              aaltosulkujen väliin sijoitetaan elementin $b
{ $b/description }            description -elementin sisältö
         Kyselyn tulos

 <tulos>
   <kuvaus>Red Bicycle</kuvaus>
   <kuvaus>Tricycle</kuvaus>
   <kuvaus>Broken Bicycle</kuvaus>
</tulos>
                        Esimerkkikyselyt
   Seuraavat esimerkit ovat peräisin edelleen dokumentista
     XML Query Use Cases
     W3C Working Draft 15 November 2002
       http://www.w3.org/TR/xmlquery-use-cases/

       dokumentin kohdasta
       1.4 Use Case "R" - Access to Relational Data
                          Kyselyesimerkki Q1
Q1:
     Tee lista, jossa on tuotenumero ja tuotekuvaus niistä tuotteista, joiden kuvauksessa
      esiintyy sana “Bicycle” ja jotka ovat tällä hetkellä kaupattavana ja lajittele lista
      tuotenumerojärjestykseen.
                        Kyselyesimerkki Q1
<result>
 {
   for $i in document("items.xml")//item_tuple
   where $i/start_date <= current-date()
    and $i/end_date >= current-date()
    and contains($i/description, "Bicycle")
   order by $i/itemno
   return
      <item_tuple>
         { $i/itemno }
         { $i/description }
      </item_tuple>
 }
</result>
                      Kyselyesimerkki Q1
<result>
  <item_tuple>
     <itemno>1003</itemno>
     <description>Old Bicycle</description>
  </item_tuple>
  <item_tuple>
     <itemno>1007</itemno>
     <description>Racing Bicycle</description>
  </item_tuple>
</result>
                          Kyselyesimerkki Q2
Q2:
     Tee kaikista polkupyöristä lista, johon tulee tuotenumero, kuvaus ja korkein tarjous, jos
      tarjouksia on tehty.
                       Kyselyesimerkki Q2
<result>
 {
   for $i in document("items.xml")//item_tuple
   let $b := document("bids.xml")//bid_tuple[itemno = $i/itemno]
   where contains($i/description, "Bicycle")
   order by $i/itemno
   return
      <item_tuple>
         { $i/itemno }
         { $i/description }
         <high_bid>{ max(for $z in $b/bid return decimal($z)) }</high_bid>
      </item_tuple>
 }
</result>
                   Kyselyesimerkki Q2
<result>
<item_tuple>
<itemno>1001</itemno>
        <description>Red Bicycle</description>
        <high_bid>55.0</high_bid>
</item_tuple><item_tuple>
<itemno>1003</itemno>
        <description>Old Bicycle</description>
        <high_bid>20.0</high_bid>
</item_tuple><item_tuple>
<itemno>1007</itemno>
        <description>Racing Bicycle</description>
        <high_bid>225.0</high_bid>
</item_tuple><item_tuple>
<itemno>1008</itemno>
        <description>Broken Bicycle</description>
        <high_bid></high_bid>
</item_tuple>
</result>
                          Kyselyesimerkki Q3
Q3:
     Hae ne tarjoukset, jossa asiakkaan luotettavuuden arvio on huonompi (aakkosissa
      suurempi) kuin "C".
                         Kyselyesimerkki Q3
{
    for $u in document("users.xml")//user_tuple
    for $i in document("items.xml")//item_tuple
    where $u/rating > "C"
      and $i/reserve_price > 1000
      and $i/offered_by = $u/userid
    return
       <warning>
         { $u/name }
         { $u/rating }
         { $i/description }
         { $i/reserve_price }
       </warning>
 }
</result>
                 Kyselyesimerkki Q3
<result>
  <warning>
     <name>Dee Linquent</name>
     <rating>D</rating>
     <description>Helicopter</description>
     <reserve_price>50000</reserve_price>
  </warning>
</result>
                         Kokeile itse
Esimerkkipaikkoja:

http://xquerydemo.enosyssoftware.com/
http://tamino.demozone.softwareag.com/demoXQuery/index.html

Ja monia muita
http://www.w3.org/XML/Query

				
DOCUMENT INFO
Shared By:
Categories:
Stats:
views:21
posted:7/14/2011
language:Finnish
pages:54