11.07.2015 Views

selykielen suunnittelu ja toteutus Samu Viita

selykielen suunnittelu ja toteutus Samu Viita

selykielen suunnittelu ja toteutus Samu Viita

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Osa-kokonaisuussuhteen käsittelyyn kykenevän helppokäyttöisen ky<strong>selykielen</strong><strong>suunnittelu</strong> <strong>ja</strong> <strong>toteutus</strong><strong>Samu</strong> <strong>Viita</strong>Tampereen yliopistoTietojenkäsittelytieteiden laitosPro gradu -tutkielmaMaaliskuu 2002


Tietojenkäsittelytieteiden laitos<strong>Viita</strong> <strong>Samu</strong>Pro gradu -tutkielma, 74 sivuaMaaliskuu 2002TiivistelmäTutkielmassa toteutetaan osa-kokonaisuussuhteiden käsittelyyn soveltuvanky<strong>selykielen</strong> prototyyppi. Myös kielen ominaisuuksia <strong>ja</strong> sen poh<strong>ja</strong>lla olevaamallinnusmenetelmää esitellään. Suunnittelussa on kiinnitetty ensisi<strong>ja</strong>isestihuomiota ky<strong>selykielen</strong> helppokäyttöisyyteen <strong>ja</strong> osa-kokonaisuussuhteen erityispiirteidenhuomioon ottamiseen. Erityispiirteitä tukee muun muassa intensionaalistentietojen tarkastelun mahdollistaminen kyselyissä.Usein olemassaolevissa kyselykielissä osa-kokonaisuushierarkioiden käsittelyon monimutkaista <strong>ja</strong> kyselyjen ilmaisu muistuttaa ohjelmointia. Kehitetynkielen käyttäjältä ei sen si<strong>ja</strong>an vaadita ohjelmointitaito<strong>ja</strong>. Kielen deklaratiivisuudenasteen on tarkoitus olla mahdollisimman korkea. Kielen käyttäjän eitarvitse hallita rekursiota, iteraatiota, mallinsovitusta tai muita ohjelmointitekniikoita.Kielessä ei tarvitse navigoida osa-kokonaisuusrakenteessa polkuesityksellä.Osa-kokonaisuushierarkiaa ei myöskään tarvitse purkaa hierarkiaasisältämättömäksi rakenteeksi. Sekä navigointi, että hierarkiarakenteen purkuhierarkittomaksi vaativat tarkkaa tietoa intensionaalisesta-, eli kaaviotasosta.Navigointi on yleistä oliotietokannoissa. Rakenteen purkaminen hierarkittomaksion puolestaan tyypillistä nf 2 -mallille.Tutkielmassa kehiteltävä ky<strong>selykielen</strong> <strong>toteutus</strong> poh<strong>ja</strong>utuu deduktiiviseenolio-orientoituneeseen tietokantaparadigmaan. Osa-kokonaisuussuhteen mallinnusperustuu indeksointimekanismiin. Sen avulla intensionaalinen <strong>ja</strong> ekstensionaalinentaso saadaan sidottua toisiinsa kaksisuuntaisesti. Lisäksi mekanismillapystytään analysoimaan osa-kokonaisuusrakennetta monipuolisesti. Mallinnustoteutettiin Prolog++ -ohjelmointikielellä, joka tuki kielen toteuttamistahyvin.Avainsanat <strong>ja</strong> -sanonnat: osa-kokonaisuussuhde, deduktiivinen oliotietokanta,kyselykieli, indeksointimekanismi.


ii1. Johdanto ............................................................................................................12. Osa-kokonaisuussuhteen luonnehdinta.......................................................32.1. Osa-kokonaisuussuhteen yleiskäsitteitä ....................................................32.2. Osa-kokonaisuussuhdetyypien <strong>ja</strong>ottelu<strong>ja</strong>..................................................52.3. Osa-kokonaisuussuhteessa huomioitavia rajoituksia ..............................72.3.1. Riippuvuus....................................................................................................72.3.2. Poissulkeutuvuus ........................................................................................72.3.3. Monikertaisuus ............................................................................................82.4. Osa-kokonaisuussuhde verrattuna muihin mallintamisrakenteisiin ....83. Lähestymistavat osa-kokonaisuussuhteen esittämiseen <strong>ja</strong> käsittelyyn.113.1. Intensionaalisen <strong>ja</strong> ekstensionaalisen tason määrittely..........................113.2. Nf 2 (Non-first normal form) -esitystapa....................................................123.3. Olio-orientoituneisuus ................................................................................143.3.1. O 2-oliomalli <strong>ja</strong> OQL kyselykieli ...............................................................143.3.2. Qal-tietomalli <strong>ja</strong> -kyselykieli ....................................................................173.3.3. ODMG 3.0 -standardi................................................................................213.4. Deduktiiviset tietokannat ...........................................................................234. Helppokäyttöisen <strong>ja</strong> ilmaisuvoimaisen ky<strong>selykielen</strong> piirteet .................254.1. Helppokäyttöisen kielen vaatimuksia ......................................................254.2. Eri tasojen tarkastelu kyselykielessä.........................................................264.3. Esimerkkejä intensionaalisista kyselyistä ................................................284.4. Esimerkkejä ekstensionaalisista kyselyistä ..............................................294.5. Esimerkkejä intensionaalis-ekstensionaalisista kyselyistä ....................294.6. Esimerkkejä yhdistetyistä kyselyistä ........................................................294.7. Muita kielen vaatimuksia osa-kokonaisuussuhteiden käsittelyyn ......315. Ky<strong>selykielen</strong> edellyttämä esitystapa...........................................................325.1. Intensionaalisen <strong>ja</strong> ekstensionaalisen tason sitominen toisiinsa...........325.2. Olio-orientoitunut esitystapa osa-kokonaisuussuhteille .......................325.2.1. Indekseihin perustuva analysointi PSE-esitystavassa..........................385.3. Ohjelmointikielen valinta ky<strong>selykielen</strong> toteuttamiseen.........................385.3.1. Logiikkaohjelmointi ..................................................................................395.3.2. Prolog ..........................................................................................................415.3.3. Prolog++......................................................................................................425.4. Prolog++ -<strong>toteutus</strong>tapa PSE-esitystavalle................................................435.4.1. Esitystavan edellyttämän olion <strong>ja</strong> luokan piirteet.................................445.4.2. Indeksointimekanismi <strong>toteutus</strong> Prologilla.............................................465.4.3. PSE-tietokannan kuvaus <strong>ja</strong> esimerkkitietokanta...................................486. Kielen primitiivit <strong>ja</strong> esimerkkikyselyt.........................................................516.1. Kielen syntaksiin vaikuttavia tekijöitä .....................................................51


iii6.2. Kielen primitiivit..........................................................................................516.2.1. Intensionaaliset primitiivit .......................................................................526.2.2. Intensionaalis-ekstensionaaliset primitiivit ...........................................546.2.3. Kyselyn tuloksen esittämisprimitiivit.....................................................566.2.4. Muut primitiivit <strong>ja</strong> komennot ..................................................................596.3. Esimerkkikyselyt..........................................................................................606.3.1. Intensionaaliset esimerkkikyselyt ...........................................................606.3.2. Ekstensionaaliset kyselyt..........................................................................636.3.3. Intensionaalis-ekstensionaaliset kyselyt.................................................657. Yhteenveto ......................................................................................................698. Lähdeluettelo..................................................................................................68


ivTermitC++ Proseduraalinen ohjelmointikieli,jossa on olioohjelmointikielenominaisuuksia.DeklaratiivinenohjelmointikieliOhjelmointikieli, jolla lopputuloskuvaillaan korkealla abstraktiotasollayksityiskohdistavälittämättäHybridikieliOhjelmointikieli, joka yhdistääuseampia ohjelmointiparadigmo<strong>ja</strong>Proseduraalinen Ohjelmointikieli, jossa ohjelmoi<strong>ja</strong>ohjelmointikielimäärää lopputuloksenvaihe vaiheelta <strong>ja</strong> rivi riviltä.Vastakohta deklaratiivisellekielelleSQL Structured query language.Yleinen relaatiotietokantojenyhteydessä käytetty deklaratiivinenkyselykieli.


11. JohdantoOsa-kokonaisuussuhde (part-of-, part-whole-, whole-part -relationship) on tärkeäkäsitteellinen mallintamisrakenne tietokantojen yhteydessä. Sitä käytetäänrakenteellisen informaation, kuten esimerkiksi rakenteellisesti monimutkaistenolioiden mallintamiseen. Tällaisen mallintamisen avulla voidaan kuvata monenlaisiaabstrakte<strong>ja</strong> tai konkreettisia asioita. Osa-kokonaisuussuhteen mallintamista<strong>ja</strong> käytetään monilla sovellusalueilla, maantieteellisissä informaatiosysteemeissä(GIS) [Price et al., 2000], dokumenttien hallinnassa [Lambrix, 2000],lääketieteellisissä sovelluksissa [Hanh et al., 1999] <strong>ja</strong> tekoälyn sovelluksissa[Lambrix, 2000]. Kokonaisuuksia voidaan käyttää myös tietokannoissa lukituksen,tiedonvarastoinnin, tietokantahaun <strong>ja</strong> versioinnin yksikkönä. [Kim et al.,1987a; Kim et al., 1987b].Osa-kokonaisuussuhteet perustuvat kahteen keskeiseen käsitteeseen, komposiittiin<strong>ja</strong> komponenttiin. Komposiitti tarkoittaa kokonaisuutta, joka muodostuukomponenteista. Komponentti on puolestaan osa jotain komposiittia.[Wand et al., 1999] Komponentti <strong>ja</strong> komposiitti ovat keskinäisessä vuorovaikutuksessamonella tavalla. Komposiitilla on usein ominaisuuksia, jotka perustuvatsen osien ominaisuuksiin tai esimerkiksi sen kaikkien osien yhteisvaikutukseen.Lisäksi komponentilla saattaa olla ominaisuuksia, jotka riippuvat senkomposiitin ominaisuuksista. Komposiitin <strong>ja</strong> komponentin olemassaolo voimyös riippua toistensa olemassaolosta.Osa-kokonaisuussuhde ei välttämättä rajoitu pelkästään välittömiin komponentteihintai komposiitteihin. Rakenteellisesti monimutkaisilla objekteillasaattaa olla myös välillisiä komponentte<strong>ja</strong>. Välillistä komponenttia voidaan havainnollistaaseuraavalla esimerkillä. Oletetaan, että kompositiolla A on komponenttinaB. B:llä on edelleen komponenttina C <strong>ja</strong> C:llä komponenttina D. TällöinA:n välitön komponentti on B <strong>ja</strong> sen välillisiä komponentte<strong>ja</strong> ovat C <strong>ja</strong> D.Sekä välittömät, että välilliset komponentit tulkitaan usein kokonaisuudenkomponenteiksi. Myös välilliset komposiitit tulkitaan samalla tavalla, muttakäänteisesti. Tällaisia välillisiä suhteita sanotaan myös transitiivisiksi suhteiksi.Reittiä komposiitista komponenttiin tai päinvastoin kutsutaan poluksi.Tietokannoista tieto<strong>ja</strong> haetaan kyselykielten avulla. Monesti olemassaolevillakyselykielillä osa-kokonaisuussuhteen käsittelyn ilmaiseminen on vaikeaaloppukäyttäjälle. Käsittely saattaa edellyttää rekursiivisen <strong>ja</strong> iteratiivisen a<strong>ja</strong>ttelutavansisäistämistä. Usein edellytetään myös tietoa esitystavan yksityiskohdista.Lisäksi on yleistä, että transitiivisia suhteita sisältävissä rakenteissa täytyyetsiä haluttu komponentti rakenteesta navigoimalla polkuesitystavalla. Toi-


2nen tapa poistaa kompleksisuutta on purkaa komponenttien välillä vallitsevahierarkia. Kummassakin tapauksessa osa-kokonaisuusrakenne täytyy entuudestaantuttu, jotta käsittely onnistuu.Osa-kokonaisuussuhteessa tieto esitetään <strong>ja</strong> käsitellään sekä intensionaalisellaettä ekstensionaalisella tasolla. Intensionaalinen taso tarkoittaa kaaviotasoa, jossamääritellään eksplisiittisesti komponentti- <strong>ja</strong> komposiittityypit, tyyppien ominaisuudetsekä niiden keskinäiset suhteet. Ekstensionaalisella tasolla on intensionaalisellatasolla määriteltyjen käsitteiden ilmentymät. Jos jostakin intensionaalisellatasolla määritellystä käsitteestä muodostetaan ilmentymä, sen ominaisuudet,eli attribuutit arvottuvat.Pääosin useimmat kyselykielet on tarkoitettu ekstensionaalisten tietojenhakuun esittämällä intensionaalisia kriteereitä. Intensionaalisen tason monipuolistatarkastelua ei kuitenkaan usein tueta. Intensionaalisten asioiden tarkastelulisää kuitenkin ilmaisuvoimaa etenkin osa-kokonaisuussuhteita käsittelevillekyselykielille. Tässä tutkielmassa kehitetyssä kielessä molempien tasojenmonipuolinen tarkastelu on mahdollista.Tutkielmassa tarkastelen osa-kokonaisuussuhteen mallintamisratkaisua <strong>ja</strong>kehitän siihen perustuvaa kyselykieltä. Mallintamisratkaisun <strong>ja</strong> siihen perustuvaky<strong>selykielen</strong> toteutan logiikkaohjelmointi- <strong>ja</strong> olioparadigman yhdistävällä,Prolog++ -hybridikielellä. Mallintamisratkaisun periaate perustuu Timo Niemen[1983] arvo-orientoituneeseen esitystapaan, jota Niemi, Kalervo Järvelin <strong>ja</strong>Marko Junkkari ovat myöhemmin kehitelleet. Erityisen suurta huomiota kiinnitänky<strong>selykielen</strong> korkeaan deklaratiivisuuden asteeseen käyttäjäystävällisyydentakaamiseksi. Tutkielmani päätarkoituksena on kehittää kyselykieli, jokaottaa huomioon osa-kokonaisuussuhteen luonteen vaatimukset <strong>ja</strong> erityispiirteet.


32. Osa-kokonaisuussuhteen luonnehdinta2.1. Osa-kokonaisuussuhteen yleiskäsitteitäOsa-kokonaisuussuhde on käsitteenä monimerkityksellinen, joten sen tarkkara<strong>ja</strong>aminen on vaikeaa. Luonteenomaista suhteelle on, että se pyrkii kuvaamaanitsenäisesti tunnistettavaa kokonaisuutta, joka muodostuu useammastakuin yhdestä tunnistettavasta osasta. Tällöin osat eivät saa olla pelkkiä ominaisuuksia,vaan tavallaan itsenäisesti tunnistettavia objekte<strong>ja</strong>, joilla on omia ominaisuuksia.Lisäksi osalla on oma merkityksensä kokonaisuuden kannalta. Tämäei kuitenkaan tarkoita, että osia <strong>ja</strong> kokonaisuuksia voisi aina erottaa toisistaan.Kokonaisuus on puolestaan osiensa muodostama, <strong>ja</strong> sillä on aina joitakinuusia ominaisuuksia, joita sen osilla ei ole. Voidaankin sanoa, että kokonaisuuson enemmän kuin osiensa summa.Osien suhteita on tutkittu formaalilla tasolla mereologiassa (filosofian eräsalue) <strong>ja</strong> kokonaisuuksien teoriaa topologiassa. Lisäksi on olemassa mereotopologia,joka yrittää yhdistää kaksi aikaisemmin esitettyä teoriaa [Varzi, 1996]. Mereologiassatutkitaan osien suhteita muihin osiin. Teoria tunnistaa transitiivisuussuhteenosien välillä. Transitiivisuusominaisuuden huomioonotto on tutkielmassakeskeisessä osassa. Mereologiassa tunnistetaan lisäksi osien välillä olevasymmetrisyys <strong>ja</strong> refleksiivisyys. Mereologinen symmetrisyys tarkoittaa, että jososalla a on osa b <strong>ja</strong> osalla b on osa a, niin tällöin a = b. Refleksiivisyys puolestaantarkoittaa, että osa on itsensä osa. Tässä tutkielmassa symmetrisyys pätee,mutta refleksisyys ei. Tämä johtuu siitä, että usein arkielämässä osan ei katsotaolevan itsensä osa. Tutkielman kyselykieli on tarkoitettu mahdollisimmanhelppokäyttöiseksi <strong>ja</strong> refleksiivisyysominaisuuden noudattaminen saattaisi aiheuttaaväärinkäsityksiä.Mereologia keskittyy ainoastaan ekstensionaaliseen tasoon. Tämä seikka aiheuttaaongelmia erityisesti olemassaolon periaatteen kohdalla. Periaatteenmukaan kaksi objektia ovat identtisiä keskenään, jos niillä on samat osat samallaa<strong>ja</strong>n hetkellä. Tämä vaatimus on liian tiukka käytännön tilanteisiin [Lambrixand Padgham, 2000], mukaan lukien kyselykielet. On esimerkiksi mahdollistaolla kaksi eri tahon julkaisemaa konferenssijulkaisua, joissa on kuitenkin samatartikkelit.Seuraavaksi esitän tutkielman ky<strong>selykielen</strong> kannalta osakokonaisuussuhteessaolevia olennaisia käsitteitä. Kuva 1. demonstroi osakokonaisuussuhteeneri käsitteitä graafisesti.


4abc d e f ghiKuva 1. Esimerkki osa-kokonaisuussuhteestaPerusolioksi (basic object) kutsutaan oliota, jolla ei ole komponentte<strong>ja</strong>. Kuvassa 1.perusolioina ovat d, e, f, g, h <strong>ja</strong> i. Ylimmän tason olio (super object) puolestaan tarkoittaaoliota, jolla ei ole kompositiota. Näitä ovat kuvassa a <strong>ja</strong> b. Polku (path)jostain oliosta toiseen osa-kokonaisuussuhteessa olevaan olioon tarkoittaa reittiä,joka yhdistää oliot a <strong>ja</strong> b toisiinsa. Esimerkissä Polku oliosta a olioon i koostuureitistä a-c-i. Jaetuksi osaksi (shared object) kutsutaan osaa, joka on vähintäänkahden komposiitin komponenttina. Kuvassa 1 olio e on tällainen.Osa-kokonaisuussuhteen mallintamisen tarkoitus on kohdealueen kokonaisuuden<strong>ja</strong> sen osien välisen suhteen esittäminen. Kir<strong>ja</strong>llisuudessa puhutaanusein myös kompleksisista objekteista [Järvelin and Niemi, 1999; Savnik et al.1999; Carey et al., 1988] <strong>ja</strong> komposiittiobjekteista [Halper et al., 1998; Motscnig-Pitrik and Kaasboll, 1999]. Vaikka monet puhuvat aggregaatiosuhteista osakokonaisuussuhteidenyhteydessä, termi on moniselitteinen.Motschnig-Pitrik <strong>ja</strong> Kaasboll [1999] tekee erottelun komposition <strong>ja</strong> aggregaatinvälille. Aggregaatin <strong>ja</strong> komposition semantiikat eroavat toisistaan heidänerottelussaan seuraavalla tavalla: aggregaatti voi olla jokin kompleksinen rakenne,jossa jäsenillä ei ole komponentti- tai komposiittisuhdetta keskenään.Esimerkiksi tästä Motschnig-Pitrik kollegoineen ottaa huoneen, joka voidaantulkita joko aggregaatiksi tai komposiitiksi. Jos huone tulkitaan koostuvan lattiasta,seinistä, ikkunoista <strong>ja</strong> ovista, puhutaan kompositiosta. Jos taas huone nähdäänsiihen liittyvien ominaisuuksien joukkona, kuten esimerkiksi omista<strong>ja</strong>,koko <strong>ja</strong> si<strong>ja</strong>inti, tulkitaan huone aggregaatiksi. Aggregaatti on siis erottelussakäytännöllisemmässä <strong>ja</strong> yleisemmässä merkityksessä kuin komposiitti. Aggregaatinyhteydessä huoneeseen yhdistetään attribuutte<strong>ja</strong>, joilla on merkitys jossakinsovelluksessa. Tässä tapauksessa attribuuttien tarkoituksena ei ole kui-


5tenkaan olla itsenäisiä objekte<strong>ja</strong>, vaan mallintaa huoneeseen liittyviä ominaisuuksia.Huoneen osina ei siis ole omista<strong>ja</strong> eikä si<strong>ja</strong>inti, vaikka ne mallinnusrakenteenkannalta liitetäänkin huoneeseen. Ominaisuudet voivat kuitenkin aggregaatissaolla kompleksisia rakenteita. Huone -esimerkissä muun muassahuoneen omista<strong>ja</strong>lla voi olla attribuutte<strong>ja</strong> <strong>ja</strong> komponentte<strong>ja</strong>. Sen si<strong>ja</strong>an vastaavakompositio -esimerkki oli selvästi tarkoitettu mallintamaan osakokonaisuussuhdetta.Tässä työssä pidättäydyn samassa erottelussa, jotta väärinkäsityksiltävältyttäisiin.Transitiivisuus on keskeisessä roolissa osa-kokonaisuussuhteissa. Esimerkkinätarkastelen autoa, joka edustaa kokonaisuutta. Auton renkaan pölykapselion renkaan komponentti <strong>ja</strong> rengas puolestaan auton komponentti. Toisin sanoenpölykapseli on myös auton komponentti. Komposiitin kohdalla tulkinta onkäänteinen: koska auto on renkaan komposiitti <strong>ja</strong> rengas pölykapselin komposiitti,silloin myös auto on pölykapselin kompositti. Transitiivinen tulkinta eikuitenkaan ole itsestäänselvyys kaikissa tilanteissa [Winston et al., 1987; Iris etal., 1988; Artale et al., 1996]. Mielekkyys katoaa muun muassa seuraavassa esimerkissä:käsi on <strong>ja</strong>lkapalloili<strong>ja</strong>n osa <strong>ja</strong> <strong>ja</strong>lkapalloili<strong>ja</strong> on <strong>ja</strong>lkapallojoukkueenosa, mutta kättä ei ole mielekästä enää tulkita joukkueen osaksi. Transitiivinentulkinta ei ole edellä mielekäs, koska käden <strong>ja</strong> ihmisen suhteen luonne on erilainen,kuin ihmisen <strong>ja</strong> joukkueen suhteen luonne. Onkin huomattu, että transitiivinentulkinta saattaa menettää mielekkyytensä, jos luonteeltaan erilaisiasuhdetyyppejä sekoitetaan mielivaltaisesti keskenään [Winston, 1987]. Tämäntakia on syytä erottaa <strong>ja</strong> tunnistaa erilaisia osa-kokonaisuussuhdetyyppejä.2.2. Osa-kokonaisuussuhdetyypien <strong>ja</strong>ottelu<strong>ja</strong>Osa-kokonaisuussuhteiden eri tyyppien <strong>ja</strong>ottelu on vaikea tehtävä. Kaikki suhdetyypiteivät ole selkeästi luokiteltavissa johonkin tiettyyn tyyppiin kuuluvaksi.Monissa <strong>ja</strong>otteluyrityksissä on inhimillisellä tulkinnalla merkitystä, eikä tulkintaavoida poistaa tässäkään tutkielmassa. Lisäksi eri näkökulmat painottuvattieteenalasta riippuen, jossa suhteita tutkitaan. Pääasia kuitenkin tutkielmanky<strong>selykielen</strong> kannalta on se, että käytettävässä sovellusalueessa transitiivisuuspätee osien <strong>ja</strong> kokonaisuuksien kesken.Kielitieteen <strong>ja</strong> kognitiotieteen saralla on tehty ontologinen erotteluehdotus[Winston et al., 1987], joka poh<strong>ja</strong>utuu erilaisiin osa-kokonaisuussuhteiden tyypeihin.Seuraavaksi esittelen yhteenvedon tästä erotteluehdotuksesta:Komponentti/kokonaisuuden muodostava olio: Kokonaisuuden muodostavillaolioilla on rakenne, jonka muodostavat erilliset komponentit, joilla ontietty oma merkitys tai toiminta kokonaisuuden kannalta. Esimerkiksi renkaat


6ovat osa autoa <strong>ja</strong> fonologia on osa kielitiedettä. Tämä tyyppiset osakokonaisuussuhteetovat pääosin niitä, johon tutkielman kyselykieli keskittyy.Jäsen/kokoelma: Muodostaa käsityksen jäsenyydestä suhteessa tiettyyn olioidenkokoelmaan. Jäsenillä ei ole toiminnallista roolia kokonaisuudessa, muttane voidaan tunnistaa kokonaisuudesta. Esimerkiksi puu (jäsen) on osa metsää(kokoelma).Osa, osuus massasta: Kokonaisuutta tarkastellaan homogeenisenä koosteena.Lisäksi sen osuudet tai osat ovat samankaltaisia kuin kokonaisuus, muttakuitenkin erotettavissa siitä. Esimerkiksi siivu on osa piirasta.Aine/olio: Tyyppi ilmaisee aineksena olevan olion: ”… on osittain puuta”tai ”… on tehty jostakin”. Ainetta, josta olio on tehty, ei voida erottaa oliostaeikä sillä ole funktionaalista roolia. Esimerkiksi lentokone on tehty osaksi alumiinista.Vaihe/toiminta: Tämä typpi ilmaisee aktiviteetin vaiheen. Vaihe on kuinkomponentti, jolla on toiminnallinen rooli, mutta se ei ole kuitenkaan erotettavissairralleen koko toiminnasta. Esimerkiksi halkoon tarttuminen on osa halkojenpinoamista.Paikka/alue: Avaruudellinen relaatio alueiden kesken, joilla eri oliot si<strong>ja</strong>itsevat.Osat kuuluvat johonkin suurempaan alueeseen, mutta niitä ei voi erottaatästä alueesta erilleen. Esimerkiksi lähde on osa aavikkoa.Edellä esitetyssä <strong>ja</strong>lkapalloesimerkissä transitiivisuusominaisuuden mielekkyyskadotettiin, koska siinä sekoitettiin komponentti/kokonaisuus-suhde <strong>ja</strong>jäsen/kokoelmasuhde keskenään.Yllä esitetty <strong>ja</strong>ottelu on saanut myös kritiikkiä siitä, että sen näkökulma onliian kielitieteellinen. Lisäksi jotkin suhdetyypit ovat liian tulkinnanvaraisia.Tämän vuoksi jotkin erityispiirteet ovat hämäriä <strong>ja</strong> kiistanalaisia. Seuraavassakahdessa erotteluehdotuksessa on yritetty vähentää tulkinnanvaraisuutta.Ensiksi tarkasteltavassa <strong>ja</strong>otteluehdotuksessa tunnistetaan kuuden suhdetyypinsi<strong>ja</strong>sta neljä suhdetyyppiä [Iris et al., 1988]. Ne ovat funktionaalinenkomponenttisuhde, lohko/kokonaisuussuhde, jäsen/kokoelma -suhde <strong>ja</strong> osajoukko/joukko-suhde. Funktionaalisessa komponenttisuhteessa komponenttiei ole ainoastaan rakenteellinen yksikkö, vaan osalla on myös tärkeä tehtävä taitoiminta kompositiossa. Esimerkkinä tästä on polkupyörä <strong>ja</strong> rengas, jolloin renkaallaon tärkeä tehtävä polkupyörän toiminnassa. Lohko/kokonaisuussuhteentarkoitus on kuvata tilannetta, jossa kokonaisuudesta on eroteltavissa tai siirreltävissäosia. Osat ovat kuitenkin samankaltaisia, kuin kokonaisuus <strong>ja</strong> kokonaisuudentäytyy olla olemassa ennen kuin osat ovat olemassa. Kaksi viimeistäerottelua, jäsen/kokoelma <strong>ja</strong> osajoukko/joukko ovat samat kuin Winstonin <strong>ja</strong>kumppaneiden [1987] erottelussa.


7Toisessa <strong>ja</strong>ottelussa [Gerstl and Pribbenow, 1995] osakokonaisuussuhteeterotellaan komposiittien rakenteen mukaan. Eri suhdetyyppejäon kolme: Komplekseilla on heterogeeninen rakenne <strong>ja</strong> niiden osia kutsutaankomponenteiksi. Osien <strong>ja</strong> kokonaisuuksien välillä on tällöin funktionaalinen,a<strong>ja</strong>llinen <strong>ja</strong> avaruudellinen suhde. Kokoelmat puolestaan muodostuvatelementeistä, jotka ovat suhteessa kokonaisuuteen samalla tavalla. Lambrix[2000] havainnollistaa laivastoesimerkillä hyvin kompleksien <strong>ja</strong> kokoelmieneroa: laivasto voidaan a<strong>ja</strong>tella kokoelmana, jos sen jäsenillä ei ole mitään erikoistaroolia. Se voidaan a<strong>ja</strong>tella myös kompleksiksi, jos jokaisella laivalla ontietty si<strong>ja</strong>inti sekä toiminta laivastossa. Massat ovat homogeenisiä <strong>ja</strong> ne voidaan<strong>ja</strong>kaa suureisiin. Jaottelussa tunnistetaan vielä kaksi tapaa erottaa osat kokonaisuudesta.Erottelu on <strong>ja</strong>ettu segmentteihin <strong>ja</strong> osuuksiin. Esimerkkinä segmentistäon artikkelin johdanto, joka on siis segmenttinä koko artikkelissa. Osuudellatarkoitetaan tässä tilanteessa puolestaan kokonaisuuden jotain osaa, joka voidaanvalita ominaisuusulottuvuuden avulla. Esimerkkinä tästä on rosoisetkohdat seinästä, jolloin rosoiset kohdat ovat tietty osuus koko seinästä.2.3. Osa-kokonaisuussuhteessa huomioitavia rajoituksiaKäsitteellisessä mallintamisessa <strong>ja</strong> tietokantojen toteutuksessa tulee ottaa huomioonosa-kokonaisuussuhteen luonteesta johtuvia rajoituksia, kuten riippuvuus(dependency), poissulkevuus (exclusiveness) <strong>ja</strong> monikertaisuus (multiplicity)[Halper et al, 1998;Motschnig-Pitrik and Kaasboll, 1999].2.3.1. RiippuvuusRiippuvuus osien kesken tarkoittaa sitä, että jos jokin osa A on riippuvainenB:stä, niin A ei voi olla olemassa, jos B:tä ei ole olemassa. B voi tässä tapauksessaolla joko A:n osa tai kokonaisuus. Riippuvuuden suunta voi olla kokonaisuudestaosiin, osista kokonaisuuteen tai kaksisuuntaista. Jos esimerkiksi kir<strong>ja</strong>poistetaan tietokannasta, on luonnollista, että myös sen sisältämät kappaleet <strong>ja</strong>sisällysluettelo poistetaan. Tässä tapauksessa osien olemassaolo riippuu kokonaisuudenolemassaolosta. Jos taas polkupyörän runko poistetaan, polkupyörääei enää kokonaisuutena ole olemassa. Tässä tapauksessa kokonaisuus onriippuvainen osastaan. Suunnittelussa täytyy myös ottaa huomioon, onko tarkoituksenmukaistatuhottaessa kokonaisuutta poistaa sen kaikki osat, vai voivatkoesimerkiksi kokonaisuutta edustavan polkupyörän osat jäädä olemaan,vaikka pyörä tuhottaisiinkin.2.3.2. PoissulkeutuvuusPoissulkeutuvuusominaisuus tarkoittaa sitä, voiko osa olla useamman kuinyhden kokonaisuuden osana vai ei. Kun on kyse konkreettisista esineistä, osaan


8liittyy usein poissulkeutuvuusominaisuus.Esimerkiksi moottori voi olla osana vain yhdessä autossa kerrallaan. Kuitenkinesimerkiksi sama artikkeli voi esiintyä useammassa konferenssijulkaisussa samaanaikaan. Moottorin oleminen jonkin auton osana sulkee pois siis sen mahdollisuuden,että se on moottorina toisessa autossa samalla a<strong>ja</strong>n hetkellä. Artikkelinoleminen osana jotain konferenssijulkaisua ei sen si<strong>ja</strong>an sulje pois artikkelinmahdollisuutta olla jonkin toisen konferenssijulkaisun osana. Poissulkeutuvuusominaisuudentoteutumisesta tulee pitää huolta, jotta tietokanta pysyisijohdonmukaisessa tilassa.2.3.3. MonikertaisuusMallinnettaessa osa-kokonaisuussuhteita voidaan asettaa rajoituksia sille,kuinka monta osaa tietyllä oliotyypillä voi olla. Esimerkiksi tietokoneen emolevysaattaa olla sellainen, johon on mahdollista kytkeä yksi tai kaksi prosessoriakiinni, jolloin kaikki muut määrät on kielletty. Tällaisia rajoituksia kutsutaaneheysrajoituksiksi <strong>ja</strong> niitä käytetään muissakin suhdetyypeissä, kuten omistus<strong>ja</strong>liitossuhteissa. Näitä muita suhdetyyppejä esitellään tarkemmin seuraavassakappaleessa.2.4. Osa-kokonaisuussuhde verrattuna muihin mallintamisrakenteisiinIs-a –suhde [Rich and Knight, 1991; Paton et al., 1996; Belford and Santone,1989; Kim et al., 1987] on toinen keskeinen mallintamishierarkia part-of suhteenohella. Tällä suhteella määritellään erikoistamisia jollekin yleiselle oliotyypille/käsitteelle.Esimerkiksi käsite auto voidaan erikoistaa käsitteiksi kuormaauto,henkilöauto <strong>ja</strong> lin<strong>ja</strong>-auto. Erikoistamisen ideana on liittää attribuutit <strong>ja</strong>toiminnallisuus is-a -hierarkian yleisistä käsitteistä niistä erikoistettuihin käsitteisiin.Erikoistetuilla käsitteillä on lisäksi joitakin sellaisia ominaisuuksia, joitayleisimmillä käsitteillä ei ole. Is-a -suhdetta kutsutaan myös usein monissa ohjelmointi-<strong>ja</strong> mallintamisparadigmoissa periytymishierarkiaksi. Joissakin tapauksissaperiytymistä voidaan rajoittaa erilaisilla suo<strong>ja</strong>usmäärityksillä. Toisinsanoen estetään joidenkin ominaisuuksien tai metodien periytyminen. Tämä onmahdollista esimerkiksi C++ -ohjelmointikielessä. Erikoistettavan käsitteen pitääolla semanttiselta luonteeltaan samankaltainen kuin yleisempi käsite. Valitettavastimallintamistilanteissa tätä periaatetta saatetaan rikkoa. Esimerkiksimatemaattisia kuvioita mallinnettaessa neliöstä voidaan erikoistaa kolmio. Tämäedellyttää, että geometriset kuviot esitetään olioina siten, että niillä on attribuutteinaantarvittavat koordinaattipisteet. Tällainen erikoistaminen voidaantehdä, sillä neliössä tarvitaan attribuutte<strong>ja</strong> kahteen, kun taas kolmiossa kolmeen


9koordinaattipisteeseen. Tämä ei ole kuitenkaankäsitteellisenmallintamisen kannalta oikeaoppista, sillä neliö ei ole kolmion yleiskäsite.Voidaan yleisesti sanoa, että is-a –suhde on tarkoitettu mallintamaan yleistys/erikoistamissuhteita,joissa attribuutit <strong>ja</strong> metodit periytyvät yleisestä erikoiseen.Erikoistetut käsitteet ovat merkitykseltään samankaltaisia kuin yleisemmätkäsitteet, mutta niillä on omia uusia ominaisuuksia tai toiminto<strong>ja</strong>.Is-a <strong>ja</strong> part-of -mallinnussuhteiden lisäksi on olemassa muun muassa attribuuttisuhde,omistussuhde <strong>ja</strong> liitossuhde [Winston et al., 1987]. Nämä saattavat joskusvaikuttaa part-of suhteelta, mutta eivät kuitenkaan ole sitä. Attribuuttisuhteellakuvataan objektin ominaisuutta, eikä attribuutilla tulisi kuvata osaa objektissa[Wand et al., 1999; Artale et al., 1996]. Omistussuhde puolestaan kuvaa objektienvälillä olevaa omistussuhdetta. Toinen objekti on tällöin omista<strong>ja</strong> <strong>ja</strong> toinenomistettava. Suhde voi kuvata esimerkiksi auto-omista<strong>ja</strong> tai isä-poika suhdetta.Omistussuhteeksi voidaan virheellisesti a<strong>ja</strong>tella myös polkupyörän <strong>ja</strong>renkaan välistä suhdetta. Jos kuitenkin tarkoitetaan, että polkupyörällä on rengaskomponenttina, niin polkupyörä ei tällöin omista rengasta, vaan kyse onpart-of –suhteesta. Liitossuhteella kuvataan jonkin asian liittymistä johonkin toiseenasiaan. Tällöin suhde voi olla part-of –suhde, mutta ei usein ole sitä. Esimerkiksilaukun <strong>ja</strong> ihmisen, tai korvarenkaan <strong>ja</strong> korvan suhdetta voidaan kuvataliitossuhteella, vaikka laukku ei ole ihmisen, eikä korvarengas korvan osa.Liitossuhde voi kuitenkin olla tietyissä tilanteissa samaan aikaan myös part-of –suhde. Näin on esimerkiksi polkupyörän <strong>ja</strong> renkaan part-of –suhteen kohdalla.Is-a- <strong>ja</strong> part-of -suhteet eroavat toisistaan monella tapaa, vaikka joskus nesekoitetaankin toisiinsa. Osa-kokonaisuussuhteessa esiintyvillä komponenteillaon toisistaan poikkeava semanttinen luonteensa, jota ei voida is-a –suhteellamallintaa. Osat tai kokonaisuudet eivät ole yleensä toistensa erikoistapauksia,joten attribuutit eivät usein periydy kokonaisuudelta osille. Tosin aikaisemminesitetyllä osa-kokonaisuussuhdetyypillä, lohko/kokonaisuus, voi lohkolla ollausein samo<strong>ja</strong> attribuutte<strong>ja</strong> kuin kokonaisuudellansakin. Tutkielmassa tarkoitanosa-kokonaisuussuhteessa periytymisellä myös ekstensionaalisten arvojen johtamistajoistakin muista part-of suhteessa olevista attribuuteista. Is-a –suhteessaperiytyminen tapahtuu ainoastaan intensionaalisella tasolla. Part-of -suhteessayleisempää sen si<strong>ja</strong>an on, että myös attribuuttien arvot periytyvät. Periytyminentapahtuu tällöin ekstensionaalisella tasolla. Tämä ei silti välttämättä tarkoita,että perivällä objektilla olisi yhtään samaa attribuuttia. Osakokonaisuussuhteessaperiytyminen voi lisäksi tapahtua kahteen suuntaan.Tällöin osat voivat periä joitakin ominaisuuksia kokonaisuudeltaan tai kokonaisuuspuolestaan voi periä ominaisuuksia yhdeltä tai useammalta osaltaan[Halper et al., 1998]. Part-of -suhteen ekstensionaalisella tasolla periytyminen


10voidaan <strong>ja</strong>kaa kahteen periytymisen tapaan, jos kokonaisuuden jokin arvoriippuu sen osien ominaisuuksista: perintä voi olla suoraa perimistä <strong>ja</strong> emergenttistäperintää [Goldstein et al., 1999]. Suoraa perimistä edustaa esimerkiksi tilanne,jossa osien si<strong>ja</strong>inti on sama kuin niiden kokonaisuuden si<strong>ja</strong>inti. Tällöin siis jokaiselleosalle periytyy kokonaisuuden si<strong>ja</strong>inti -attribuutin arvo suoraan. Emergenttinenperintä tarkoittaa sitä, että kokonaisuuden tietty ominaisuus riippuusen osien ominaisuuksien arvoista jollakin monimutkaisella tavalla. Tästä esimerkkinäauton huippunopeus, joka riippuu sen monien osien ominaisuuksista,kuten renkaista <strong>ja</strong> moottorista. Tässä tutkielmassa emergenttisiä ominaisuuksiakutsutaan johdetuiksi attribuuteiksi.


113. Lähestymistavat osa-kokonaisuussuhteen esittämiseen <strong>ja</strong> käsittelyyn3.1. Intensionaalisen <strong>ja</strong> ekstensionaalisen tason määrittelyEnnen kuin esittelen olemassaolevia lähestymistapo<strong>ja</strong>, tarkennan edellä esitettyjäintensionaalisen- <strong>ja</strong> ekstensionaalisen tason luonnehdinto<strong>ja</strong>. Tarkastelenkyseisiä taso<strong>ja</strong> relationaalisessa <strong>ja</strong> olio-orientoituneessa mallintamisessa.Intensionaalinen eli kaaviotaso määrittää ekstensionaalisen eli ilmentymätasonyhteiset piirteet. Intensionaalinen taso edustaa kaikkia tietokannassa/reaalimaailmassaolevia ilmentymiä. Ekstensionaalinen taso on puolestaanorganisoitu rakenteellisesti kaavion mukaisesti. Ilmentymätaso koostuu intensionaalisellatasolla määritellyn rakenteen mukaisista esiintymistä. Ilmentymälläon tila <strong>ja</strong> mekanismi, jolla se yksilöidään, jotta se voidaan erottaa muista ilmentymistä.Tila tarkoittaa ilmentymään liittyvien ominaisuuksien arvojenjoukkoa tiettynä a<strong>ja</strong>nkohtana. Päivitys on tämän tilan muuttamista.Nämä käsitteet ovat erityisen keskeisiä käsitteellisessä mallintamisessa. Relaatiomallissaintensionaalinen taso muodostuu relaatiokaaviosta, joka määritteleerelaation rakenteen. Taso ilmaisee relaation <strong>ja</strong> attribuuttien nimet sekä attribuuttienarvoalueet. Relaation ilmentymätaso relaatiomallissa puolestaankoostuu tupleista. Tuplet ovat relaation attribuutteihin liittyvä arvojoukko, jossajokaiseen relaation attribuuttiin liittyy yksi arvo. Tuplea voidaan a<strong>ja</strong>tella visuaalisestimyös rivinä, jossa yksittäinen rivi ilmaisee erään ilmentymän. Rivinalkioina on siis attribuuttien arvot samassa järjestyksessä, kuin ne ovat relaatiossakinesitetty. Ilmentymien yksilöimisessä käytetään avainta, joka koostuuyhdestä tai useammasta tuplen attribuuttien arvoista. Avaimen tulee olla yksikäsitteinen.Millään toisella ilmentymällä ei saa olla samaa avainta samalla a<strong>ja</strong>nhetkellä. Tämänkaltaista lähestymistapaa, jossa tietojen identifiointi perustuujoidenkin tietojen arvoihin, kutsutaan arvo-orientoituneeksi lähestymistavaksi.Täten relaatiomalli on arvo-orientoitunut.Olio-orientoituneissa tietokannoissa, kuten olio-ohjelmoinnissakin, intensionaalinentaso määritellään luokkien avulla. Luokkien välillä voidaan määritelläperiytymis- <strong>ja</strong> osa-kokonaisuushierarkioita. Luokissa määritellään attribuutit<strong>ja</strong> niiden arvoalueet. Lisäksi luokissa määritellään käyttäytyminen metodienavulla. Ekstensionaalinen taso koostuu olioista, jotka on perustettu luok-


12kahierarkian luokkiin. Oliolla on attribuutteihin liittyvät arvot, jotkamääräävät olion tilan. Oliolla on lisäksi olioidentiteetti, jonka perusteella olioyksikäsitteisesti yksilöidään. Usein olio-orientoituneet järjestelmät generoivatolio-identiteetin automaattisesti.Kompleksisille rakenteille on ehdotettu erilaisia tietämyksen esittämistapo<strong>ja</strong>.Perinteinen ensimmäiseen normaalimuotoon poh<strong>ja</strong>utuva relaatiomalli (1NF)ei tue mutkikasta rakenteellista esittämistä [Liu, 1999], koska siinä relaationattribuuttien tulee olla atomisia, eli attribuuttien arvot ovat rakenteettomia. Vierasavaimeksikutsutaan jonkun toisen relaation avaimen esiintymistä toisen relaationattribuuttina/attribuutteina. Kokonaisuudet <strong>ja</strong> osat joudutaan liittämääntoisiinsa vierasavaimien avulla. Kokonaisuutta kuvaavassa relaatiossavarataan attribuuttikenttä jokaista välitöntä osaa kohden, jotta osan yksilöivävierasavain voidaan sijoittaa siihen. Jos kokonaisuuden osilla on edelleen osia,niille joudutaan omissa relaatioissaan myös varaamaan attribuutit niiden osiavarten. Samaa menetelmää toistetaan, kunnes koko osa-kokonaisuushierarkiaon mallinnettu. Osaa kuvaava vierasavain osoittaa siis johonkin toiseen relaatioontupleen, johon osa on mallinnettuna. Tämän vuoksi kompleksinen rakennejoudutaan ha<strong>ja</strong>uttamaan moniin relaatioihin, koska jokainen osa on oma relaationsa.Tämän tekee osa-kokonaisuussuhteen käsittelystä vaikeaa <strong>ja</strong> epäintuitiivista.Päivitysoperaatiot <strong>ja</strong> rakenteen käsittely hankaloituu. Relaatioalgebra onrelaatiomallin yhteydessä käytetty formaali malli tiedon hakuun relaatioista.Perusrelaatioalgebrassa ei ole transitiivista sulkeumaa laskevaa primitiiviä, jolloinmonimutkaisten rakenteiden läpikäynti ei yleisesti onnistu. Lisäksi johdettujenarvojen mallintaminen relaatiomallilla ei onnistu, koska käytössä ei olemitään mekanismia tähän tarkoitukseen. Transitiivisten suhteiden käsittelyynonkin ehdotettu relaatiomallin yhteydessä alfa-laajennettua relaatioalgebraa,jonka alfa-operaatio kykenee yleistetyn transitiivisulkeuman käsittelyyn [Agrawal,1987]. Tämä ei kuitenkaan pysty poistamaan muita edellä esitettyjä relaatiomallinongelmia.3.2. Nf 2 (Non-first normal form) -esitystapaPerinteisen relaatiomallin attribuuttien rakenteettomuuden ongelman ratkaisemiseksion ehdotettu nf 2 –relaatiomallia [Roth et al., 1988]. Tässä mallissa relaatiotsisältävät attribuutteinaan sekä atomisia että relaatioarvoisia attribuutte<strong>ja</strong>.Edelleen relaatioarvoisilla attribuuteilla voi itsellään olla relaatioita attribuutteinaan<strong>ja</strong> niin edelleen. Koska malli mahdollistaa ra<strong>ja</strong>ttoman määrän sisäkkäisiärelaatioita, sillä kyetään mallintamaan myös kompleksisia rakenteita[Niemi and Järvelin, 1996]. Tällöin ylimmän tason relaatio sulkee sisäänsä senkaikki komponentit. Tämä tapa tiedon mallintamiseen <strong>ja</strong> käsittelyyn osa-


13kokonaisuussuhteiden yhteydessä on huomattavasti intuitiivisempaa, kuinnormaalin relaatiomallin yhteydessä.Nf 2 –relaatiomallille on kehitelty sekä formaale<strong>ja</strong> että loppukäyttäjälle tarkoitettu<strong>ja</strong>kyselykieliä [Korth and Roth, 1987]. Helppokäyttöiset kielet ovatSQL-ky<strong>selykielen</strong> kaltaisia. Nf 2 –relaatiomallin kyselykielillä on samat operaatiotkuin normaalilla relaatioalgebrallakin. Tämän lisäksi useissa kielissä on kaksiuudelleenstrukturointioperaatiota, nest <strong>ja</strong> unnest. Nest -operaatio lisää yhdenuuden hierarkiatason nf 2 –relaatioon. Operaatiolle annetaan parametriksi joukkoattribuutte<strong>ja</strong> <strong>ja</strong> se muodostaa näistä attribuuteista uuden relaatioarvoisenattribuutin. Unnest -operaatio on vastakkainen operaatio nest-operaatiolle. Sepoistaa yhden hierarkiatason nf 2 –muotoisesta relaatiosta. Nf 2 –relaatiolla on siisparemmat mahdollisuudet tiedon strukturointiin, vaikka normaali relaatiomallipystyykin tallettamaan saman informaation. Nf 2 –relaatiolla pystytään siis mallintamaankomponentit attribuutteihin, jolloin tiedon esitys ei ole niin ha<strong>ja</strong>naista.Tämä tekee kokonaisuudesta helpomman hallita, koska komposiitit <strong>ja</strong> komponentitovat samassa rakenteessa.Tarkastellaan seuraavaksi yksinkertaista kaaviota: OPISKELIJA(NIMI,KURSSI), joka on opiskeli<strong>ja</strong>sta tehty nf 2 –relaatiokaavio. Kaaviossa OPISKELIJAon relaation nimi. Relaatiossa oleva NIMI on atominen attribuutti, <strong>ja</strong> KURSSIattribuuttion relaatioarvoinen attribuutti muotoa KURSSI(KNIMI,ARVOSANA). Ekstensionaalisella tasolla tämä tarkoittaa sitä, että jokaista opiskeli<strong>ja</strong>nnimeä kohti voi esiintyä useita KNIMI-ARVOSANA -pare<strong>ja</strong>, jotka yhdessämuodostavat opiskeli<strong>ja</strong>n nimeen liittyvän relaation ilmentymän.Nf 2 –muotoiseen relaatiomalliin perustuvat kyselykielet ovat tavallisestiSQL-kielen laajennuksia, <strong>ja</strong> niitä on ehdotettu kompleksisten rakenteiden käsittelyynsoveltuviksi kyselykieliksi. Niitä on kuitenkin suhteellisen vaikea käyttää,koska käyttäjän täytyy ilmaista uudelleenstrukturointi -operaatiot. Tämänvuoksi monimutkaisia rakenteita sisältävien objektien käsittelyssä kyselynmuodostaminen on vaikea loppukäyttäjälle. Kyselyjen tekeminen muistuttaausein enemmänkin proseduraalista ohjelmointikieltä, kuin deklaratiivista kyselyjentekemistä. Tähän ongelmaan on tarjottu Timo Niemen <strong>ja</strong> Kalervo Järvelinintoimesta ratkaisua, jossa käyttäjän ei tarvitse huolehtia itse uudelleenstrukturointioperaatiosta[Niemi and Järvelin, 1996]. Heidän Prolog-toteutuksessaankäyttäjä määrittelee tuloksen rakenteen nf 2 –mallin mukaisesti <strong>ja</strong> kertoo, mistärelaatioista vastausta haetaan, sekä mitkä ehdot tulokseksi tulevan nf 2 –relaationtulee täyttää. Kuitenkaan tämäkään ratkaisu ei pysty välttämään tiettyjä ongelmia,joita tämän tutkielman esittelemässä kyselykielessä pyritään välttämään.Nf 2 –relaatiomalliin poh<strong>ja</strong>utuvan ky<strong>selykielen</strong> käyttäjällä täytyy olla tietoasekä osa-kokonaisuussuhteen rakenteesta, että attribuuttien <strong>ja</strong> relaatioiden


14nimistä. Lisäksi rakenteeseen eli intensionaaliseen tasoon kohdistuviakyselyjä ei tueta riittävästi. Osa-kokonaisuussuhteelle luonteenomaista arvojenperiytymistä nf 2 –malli ei tue lainkaan. Nf 2 -mallin heikkoutena on myös mallintamisenmahdottomuus tilanteessa, jossa komposiitissa esiintyy useampia tyypiltäänsamanlaisia osia. Tämä johtuu siitä, että malli ei salli kahta saman nimistärelaatioarvoista attribuuttia nf 2 –relaatiossa. Tämä on heikkous osakokonaisuussuhteenmallintamisessa, sillä usein löytyy tarvetta tämänkaltaistenrakenteiden muodostamiseen. Esimerkiksi henkilöautossa on neljä rengasta,joiden rakenteet ovat usein samankaltaisia keskenään.3.3. Olio-orientoituneisuusToinen lähestymistapa osa-kokonaisuussuhteen mallintamiseen tietokannassaon olio-orientoituneisuus. Olio-orientoituneen esitystavan periaatteena on se,että mikä tahansa todellinen tai abstrakti asia voidaan esittää oliona. Tämänvuoksi olio-orientoitunut paradigma tarjoaa luonnollisen <strong>ja</strong> ilmaisuvoimaisentavan monimutkaisten objektien esittämiselle. [Nahouraii and Petry, 1991].Oliomallilla on tästä samasta syystä luontevaa esittää osa-kokonaisuussuhteitasisältäviä rakenteita. Tätä tukee oliomallin ominaispiirteet: olioidentiteetti, metodit,tiedon kapselointi sekä attribuuttien mahdollisuus olla myös olioita taioliojoukko<strong>ja</strong> [Paton et al., 1999]. Olioidentiteetti huolehtii yksilöinnistä automaattisesti.Tällöin komponentti voidaan a<strong>ja</strong>tella yhtä itsenäiseksi yksiköksikuin sen kompositiokin. Metodeilla voidaan huolehtia edellä kuvailemani monimutkaiset,ekstensionaalisella tasolla tapahtuvat arvojen periytymiset. Metodeillavoidaan myös kapseloida tietoa. Tämä tarkoittaa sitä, että käyttäjältä voidaanpiilottaa hänen kannaltaan epäoleellista informaatiota. Myös arvojen periytymismekanismiosa-kokonaisuussuhteiden kohdalla voidaan kapseloidakäyttäjältä. Hänen ei siis välttämättä tarvitse aina tietää, kuinka ominaisuudetperiytyvät osista tai kokonaisuuksista. Edellä mainituista syistä johtuen olioorientoitunuttalähestymistapaa hyödynnetään myös tämän tutkielman ky<strong>selykielen</strong>toteutuksessa.3.3.1. O 2-oliomalli <strong>ja</strong> OQL kyselykieliO 2-malli [Lecluse et al., 1988; Deux et al., 1990] edustaa tyypillistä oliotietokantamallia.Siinä on olio-orientoituneisuuden keskeisimmät käsitteet käytettävissä,kuten objektien identiteetti, tyyppi, periytyminen, ylikuormitus <strong>ja</strong> myöhäinensidonta [Paton et al., 1996]. O 2oliomallissa olion rakenne on lyhyesti selitettynäseuraava: Oliot rakentuvat oliotunnisteesta <strong>ja</strong> attribuuttien arvoista. Arvotvoivat olla1. atomisia (esimerkiksi merkkijono<strong>ja</strong>, luonnollisia luku<strong>ja</strong>, jne.),


152. tuplerakenteisia (tuplen alkioiden järjestyksellä onmerkitys) ,3. joukkorakenteisia (joukon alkioiden järjestyksellä ei ole merkitystä).Olioiden esittämisessä käytetään O 2-mallissa yllä esitettyjä konstruktoreita (kutenjoukko <strong>ja</strong> tuple) tietojen rakenteistamiseen. Olio on pari (i, v), missä i onolioidentiteetti, <strong>ja</strong> v on olion arvo. Olio-orientoituneisuuden yhteydessä puhutaanusein literaalista. Literaaliksi kutsutaan arvoa, jolla ei ole minkäänlaistarakennetta, eli se viittaa vain itseensä eli tietyn tyyppiseen arvoon. Literaalilla eiole myöskään olioidentiteettiä. Esimerkiksi arvo 50 on literaali, sillä se ei koostumistään muusta kuin arvosta 50. Literaalin arvo on siis atominen.Tuple-rakennetta havainnollistaa seuraava esimerkki, joka kuvaa Nokiamerkkistärengasta, jonka halkaisi<strong>ja</strong> on 70 <strong>ja</strong> paino 0.5. Renkaan olioidentiteettinäon oid2. Arvojen liittäminen olioidentiteetin kanssa merkitsee siis olionluomista:(oid2, )Seuraava esimerkki on joukkorakenteinen, jossa olion identiteetti liitetään kahdenmuun olion identiteetin kanssa. Siinä olevan joukon voidaan kuvitella esittävänkahta rengasta.(oid3, {oid1,oid2})Yllä oleva esimerkki voisi kuvata rekka-auton rengasparia, jotka liittyvät samaanakseliin. Toisella renkaalla olisi tällöin oid1 <strong>ja</strong> toisella oid2 olioidentiteettinä.Joukkorakennetta kannattaa käyttää tähän tilanteeseen, jos on merkityksetöntäasettaa renkaita järjestykseen. Jos sen si<strong>ja</strong>an olisi tärkeää tietää, kumpirengas on vasemmalla puolella <strong>ja</strong> kumpi oikealla, olisi renkaat pitänyt mallintaatuple-rakenteen avulla.Edellä mainituilla kahdella konstruktorilla, tuplella <strong>ja</strong> joukolla, voidaan esittääkompleksisia objekte<strong>ja</strong>. Tämä johtuu siitä, että konstruktoreita voidaankäyttää sisäkkäisesti <strong>ja</strong> niissä voidaan käyttää arvoina olioidentiteettejä. Esimerkinvuoksi mallinnan seuraavaksi polkupyörän pelkistetysti O 2-mallilla.Polkupyörällä on attribuutteina hinta <strong>ja</strong> merkki. Osina ovat oh<strong>ja</strong>us, runko <strong>ja</strong>takaosa:


16(oid1, ).”Helkama”, oh<strong>ja</strong>us: oid3, runko: oid4,Tällöin oid3 olisi sellaisen olion identiteetti, jolla olisi komponenttinaan etuhaarukka<strong>ja</strong> rengas. Oid4-olioidentiteetti puolestaan kuuluisi oliolle, joka olisi tuplerakenteinen.Tällä rakenteella kuvattaisiin rungon attribuutit. Oid5:een liittyvärakenne olisi joukkorakenteinen. Joukon arvo sisältäisi takaosan alikomponentit.Polkupyörä itse (oid1) on tuplerakenteinen. O 2-oliomallilla voidaanluonnehditulla tavalla kuvata kompleksisia rakenteita, kuten osakokonaisuussuhteita.Metodien avulla voidaan lisäksi toteuttaa johdetut ominaisuudetosa-kokonaisuussuhteessa. Mallin poh<strong>ja</strong>lta ei kuitenkaan kyetä toteuttamaankyselykieltä, joka täyttää tämän tutkielman vaatimukset käyttäjäystävällisyydestä.O 2-oliomalliin poh<strong>ja</strong>utuen on tehty kyselykieli nimeltä OQL [Cluet, 1998],jolla pystytään tekemään kyselyjä mallin mukaiseen oliotietokantaan. Kyselykielipystyy käsittelemään kompleksisia objekte<strong>ja</strong>, mutta käyttäjäystävällistenkyselyjen tekeminen monimutkaisissa kyselyissä on tämän tutkimuksen vaatimuksiinusein riittämätöntä. Kyselykieli perustuu iteraattoreiden soveltamiseen<strong>ja</strong> osa-kokonaisuushierarkiassa navigointiin. Iteraattoreiden avulla voidaan käsitelläjonkin luokan kaikki ilmentymät käyttämällä siihen viittaavaa muuttu<strong>ja</strong>a.Tällöin muuttu<strong>ja</strong>n voidaan katsoa edustavan mitä tahansa luokkaan kuuluvaaoliota. Iteraattorin käyttämistä esittelen seuraavalla polkupyöräesimerkillä.Kielen varatut sanat ovat lihavoitu<strong>ja</strong>. Jos halutaan saada kaikkien kuvitteellisessatietokannassa olevien polkupyörien hinnat selville, muodostetaan seuraavakysely:select p.hinta from p in PolkupyöräIlmauksessa from arvottaa muuttu<strong>ja</strong>n p vuoron perään kaikilla luokan polkupyöräilmentymillä <strong>ja</strong> select valitsee jokaisen hinta-attribuutin arvon tulokseen.Käyttäjän täytyy ymmärtää, että p arvotetaan eri olioilla iteraattorissa, eli itetraattorillakäydään kaikki luokan oliot läpi. Jos edellä esitetystä pyöräesimerkinmukaisesta rakenteesta haluttaisiin tietää niiden pyörien merkit, joiden eturenkaidenhalkaisi<strong>ja</strong> on 0.5, täytyisi muodostaa seuraavanlainen kysely:select p.merkki from p in Polkupyörä where p.oh<strong>ja</strong>us.rengas.halkaisi<strong>ja</strong> = 0.5


17Kyselyn perusosat ovat samankaltaisia kuin relaatiotietokantojen yhteydessälaa<strong>ja</strong>ssa käytössä olevassa SQL kyselykielessäkin. Select-osassa kerrotaan, mitähalutaan, eli esimerkin tapauksessa oliota tarkoittavan p-muuttu<strong>ja</strong>n merkkiattribuutinarvo. From–osassa ilmaistaan, että p:n tulee olla olio polkupyöräluokassa.Where-osa puolestaan ilmaisee ehdon, jonka olion p tulee täyttää. Ilmaisussap:llä viitataan mihin tahansa olioon luokassa Polkupyörä. Where-osassaolevassa ilmaisussa ”p.oh<strong>ja</strong>us.pyörä.halkaisi<strong>ja</strong>” alleviivattu osa on polkuesitys.Siinä ilmaistaan, että halkaisi<strong>ja</strong>-attribuuttiin päästään polkupyörän oh<strong>ja</strong>uskomponentissakomponenttina olevan pyörän kautta käsiksi. Käyttäjän täytyy siisosata navigoida rakenteessa. Tämä tarkoittaa sitä, että hänen täytyy tietää tarkalleenkomposiitin rakenne attribuutteineen, jotta hän voisi ilmaista tiettyynkomponenttiin johtavan polun. Jos osa-kokonaisuusrakenne on monimutkainen,navigointi tekee kyselyistä vaikeita. Pelkästään iteraattorin idean ymmärtäminenon hankalaa <strong>ja</strong> rajoittavaa. Lisäksi jos oltaisiin kiinnostuneita eri tyyppisistäpolkupyöristä, kyselyä ei voitaisi ulottaa useampaan tyyppiin yhtä aikaa.Tämä johtuu siitä, että rakenne on usein erilainen eri polkupyörissä. Tällöinhalkaisi<strong>ja</strong>-attribuuttiin johtava navigointipolkukin olisi erilainen eri tyypeillä.Monimutkaisissa kyselyissä voidaan lisäksi joutua soveltamaan sisäkkäisiäiteraattorirakenteita. Tällöin ilmaisu muuttuu huomattavasti vaikeammaksi.Havainnollistan sisäkkäisiä iteraattoreita sisältäviä kyselyjä esimerkein Qaltietomallia<strong>ja</strong> -kyselykieltä käsittelevässä kappaleessa. Navigoinnin ongelma onyleinen oliomallissa. Muutkin oliomalliin poh<strong>ja</strong>utuvat kyselykielet vaativatkäyttäjältä tietoa kompleksisten olioiden rakenteesta <strong>ja</strong> näissä olevista attribuuteista.[Carey et al., 1988].3.3.2. Qal-tietomalli <strong>ja</strong> -kyselykieliJoissakin oliomalleissa käytetään funktionaalisille ohjelmointikielille ominaistaohjelmointitapaa. Tällöin kieleen sisällytetään valmiita funktioita, joiden avullakyselyjä suoritetaan. Funktiot palauttavat tuloksen, johon voidaan edelleensoveltaa funktiota. Käyttäjän täytyy tällöin tietää funktion hyväksymät parametrit<strong>ja</strong> funktion palauttama arvo. Esimerkkinä tehokkaasta funktioita hyödyntävästäkyselykielestä tarkastelen QAL-kieltä [Savnik et al., 1999]. Kieltä onmyös ehdotettu kompleksisten objektien käsittelyyn. QAL on ilmaisuvoimainenkyselykieli, joka poh<strong>ja</strong>utuu oliomalliin aivan kuten O 2 -oliomallikin. Oliot <strong>ja</strong>luokat esitetään pääpiirteittäin samaan tapaan kuin O 2 :ssa. Esimerkkinä QALluokanmäärittelystä tarkastelen department-luokkaa. Siinä varatut sanat ovatlihavoitu<strong>ja</strong>. Luokka määritellään seuraavasti:


18class departmenttype [dept_name:string, head:employee,staff:{employee}];Varattua sanaa class seuraa luokan nimi. Varatulla sanalla type määritelläänluokan tyyppi. Tyyppi määräytyy luokan attribuuttien <strong>ja</strong> niiden tietotyyppienmukaan. Kaarisulkujen sisällä määritellään attribuutti, joka on joukkoarvoinen.Yllä olevassa department-luokassa dept_name –attribuutti on siis merkkijonomuotoinen,head on puolestaan empolyee –tyyppinen olio. Se on määriteltymuualla luokkana, vaikka sitä ei esitellä tässä esimerkissä. Staff-attribuuttikoostuu puolestaan joukosta employee-tyyppisiä olioita.QAL-kielellä pystytään tekemään kyselyjä osa-kokonaisuussuhteita sisältäviinrakenteisiin. Tämän lisäksi kielellä pystytään muodostamaan uusia, kompleksisiarakenteita sisältäviä olioita. Seuraavaksi esittelen termistön, jota QALkielessäsovelletaan funktioiden käytön yhteydessä. Funktioita eli operaatioitakäytetään pelkistetysti seuraavasti: s.funktio1(p), missä s on operaation argumentti,funktio1 on operaation nimi <strong>ja</strong> p on operaation parametri. Funktiolla voiolla myös useampia parametrejä tai se voi olla parametritön. Argumentti on siisolio tai luokka, johon funktiota sovelletaan. Useista muista kielistä poiketenparametri <strong>ja</strong> argumentti ei siis tarkoita samaa asiaa. Funktio voi palauttaa toimintansatuloksena esimerkiksi numeromuotoisen arvon tai olion. QAL:ssä onkahden tyyppisiä operaatioita: malliin perustuvia <strong>ja</strong> deklaratiivisia. Kaikkimalliin perustuvat operaatiot on johdettu käsitteistä, joita on käytetty tietomallissa,johon QAL-kyselykieli poh<strong>ja</strong>utuu. Ne ovat siis teknisluonteisempia kuindeklaratiiviset operaatiot <strong>ja</strong> ne on tarkoitettu deklaratiivisten kyselyjen avuksi.Malliin perustuvia operaatioita ovat esimerkiksi val <strong>ja</strong> ext. Val käsittelee argumenttinaoliota tai luokkaa <strong>ja</strong> se palauttaa argumenttinsa arvon. Jos kyseessä onolio, arvoksi palautuu olion kaikki attribuutit <strong>ja</strong> niiden arvot. Oletetaan, ettäs1,p1 <strong>ja</strong> p2 ovat person-luokan olioiden identiteettejä. Person luokka on määriteltyseuraavalla tavalla:class persontype [name:string, age:int, address:string, family:{person}]Tällöin ilmaisun s1.val tulos voisi olla seuraava:[name:”Jim”,age:23,address:”Ljubl<strong>ja</strong>na”,family:{p1,p2}]


19Luokan ollessa kyseessä val-funktio palauttaa attribuuttien nimet <strong>ja</strong> niidentyypit. Person-luokan yhteydessä ilmaisu person.val palauttaisi seuraavan rakenteen:[name:string,age:int,address:string,family:{person}]Ext-metodia käytetään sitomaan luokka olioihinsa. Esimerkkinä funktionkäytöstä on ilmaus ”person.ext”, joka palauttaa kaikki person-luokan oliot.OQL-ky<strong>selykielen</strong> [Cluet, 1998] yhteydessä ext-metodia vastasi ilmaus in (esimerkiksip in Polkupyörä).Deklaratiivisia operaatioita käytetään deklaratiivisten kyselyjen muodostamisessa.Jokainen deklaratiivinen operaatio on siis funktio, joka manipuloiargumentte<strong>ja</strong>an. Seuraavaksi esittelen muutaman deklaratiivisen operaation <strong>ja</strong>lopuksi esittelen muutaman QAL-kyselykieleen poh<strong>ja</strong>utuvan kyselyn.Select–operaatiota käytetään suodattamaan argumentistaan halututoliotyypit. Esimerkiksi ilmaisu s.select(p), jossa s on joko olio tai tyyppi <strong>ja</strong> p ontotuusarvotyyppinen predikaatti, palauttaa p-predikaatin toteuttavan s:ää vastaavienolioiden osajoukon. Predikaatti p voi muodostua myös sisäkkäisistäkyselyistä.Apply–operaatio evaluoi parametrina olevan funktioilmaisun argumenttijoukossa,johon operaatiota sovelletaan. Alla esittelen esimerkin, joka havainnollistaaoperaation käyttöä. Esiteltävä kysely kuvaa joukon student-luokan olioidentiteettejäkyseisissä olioissa esiintyviin nimiin. Identiteettifunktio id:täkäytetään kyselyssä tarkoittamaan yksittäistä oppilasta kaikkien oppilaidenjoukosta. Kyselyssä applyn argumenttina on siis yksittäinen oppilas. Apply käykaikki luokan ilmentymät läpi. Tämänkaltainen operaatio on iteraattori, silläoperaattori suorittaa niin monta iteraatiokierrosta, kuin joukosta löytyy käsittelemättömiästudent-luokan ilmentymiä. Ilmaisussastudent.apply(id->name)apply palauttaa kaikkien student-luokkaan kuuluvissa olioissa esiintyvät nimet.Parametrinä apply-operaatiossa voi olla mikä tahansa operaatioilmaus. Funktionaalistenkielten tapaan funktioiden palauttamaan arvoon voi edelleen soveltaafunktioita. On siis mahdollista, että apply-operaatioon sovelletaan uuttaapply-operaatiota, kuten Savnik kollegoineen [1999] seuraavassa esimerkissäänesittääkin. Siinä halutaan saada tulokseksi joukko joukko<strong>ja</strong>, joissa jokainen jou-


20kossa oleva joukko sisältää yhden oppilaan kaikkien kurssien oh<strong>ja</strong>a<strong>ja</strong>t.Kysely voidaan ilmaista seuraavasti:insts_sets = student.ext.apply(id->courses).apply((id.apply(id->instructor));Insts_sets edustaa esimerkissä joukoista koostuvaa joukkoa, johon vastaus palautetaan.Kysely kuvaa ensin joukon student-luokan olioidentiteettejä joukoksijoukko<strong>ja</strong>. Nämä sisältävät olioidentiteetin, joka viittaa kursseihin, joita oppilaatovat opiskelleet. Seuraavassa askeleessa kysely korvaa jokaisen identiteetin sisäkkäisistäjoukoista olioidentiteetillä, joka viittaa tietyn kurssin oh<strong>ja</strong>a<strong>ja</strong>an. Tämänkaltainenkysely on niin mutkikas, että kyselyn suoritta<strong>ja</strong>lla täytyy ohjelmointitaidonlisäksi olla tarkempaa ymmärrystä sisäkkäisten funktioiden soveltamisesta.Apply_at -operaatio on apply:n laajennus. Apply-operaatiota on laajennettuuudella parametrilla, jonka tehtävänä on toimia komponentin valitsi<strong>ja</strong>na.Tätä operaatiota ehdotetaan ratkaisuksi sisäkkäisten rakenteiden, eli kompleksistenobjektien käsittelyongelmaan kyselykielissä. Operaatio on muotoa apply_at(p,f),jossa apply-operaatiota on laajennettu parametrillä p. Se osoittaa argumenttinaolevan kompleksisen rakenteen komponenttipolun, josta haluttukomponentti löydetään. Komponentille suoritetaan parametrin f määräämäoperaatio. Näin siis komposiittina olevasta objektista löydetään haluttu komponentti.Komponentti voi olla välillinen tai välitön komponentti operaationargumentille.Näiden QAL-ky<strong>selykielen</strong> perusprimitiivien avulla voidaan tarkastellamonipuolisempaa esimerkkikyselyä, jonka Savnik kollegoineen esittelevät. Kyselysuodattaa sisäkkäiset komponentit department-argumentista. Komponenttiidentifioidaan attribuutilla staff. Saatu joukko, jota Savnik kollegoineen kutsuusuodatetuksi joukoksi olioidentiteettejä, sisältää viittauksen työntekijöihin, jotkaovat vanhempia kuin 45 vuotta. Kyselyn tulokselle muodostetaan ensin rakenneseuraavasti:struct {[ department_name: string, head: employee, staff: {employee} ]}depts;Luotuun depts –nimiseen rakenteeseen sijoitetaan siis kyselyn tulos. On siishuomionarvoista, että käyttäjän tulee tietää kyselyn tuloksen rakenne QAL:ssä.Kysely itsessään ilmaistaan seuraavasti:


21depts = department.ext.apply(id.val).apply_at(staff, select(id->age > 45));Kaikkia QAL:n operaatioita en esitellyt edellä. Esittelemieni operaatioiden lisäksiQAL:ssä on muun muassa joukko-opista tuttu<strong>ja</strong> operaatioita <strong>ja</strong> nf 2 -mallinyhteydessä aiemmin esitellyt strukturointioperaatiot nest <strong>ja</strong> unnest. Edellä olevistaesimerkeistä voi kuitenkin päätellä, että ohjelmointitaidoton loppukäyttäjäei pysty QAL-kyselykieltä käyttämään. Kielen primitiivit eivät ole helpostiomaksuttavissa, koska suuri osa niistä on iteraattoreita, jolloin iteraatiokäsitteentulee olla käyttäjälle tuttu. Lisäksi käyttäjän tulee omaksua olioa<strong>ja</strong>ttelussakäytettyjä käsitteitä, kuten luokan <strong>ja</strong> olion arvo, sekä olion identiteetti.Edelleen käyttäjän täytyy osata käyttää metode<strong>ja</strong>, tietää niille annettavat argumentit<strong>ja</strong> parametrit sekä huolehtia siitä, että tyypit ovat oikeita. Monet metoditsaattavat toimia eri tavalla kuin käyttäjä on olettanut, jos hän antaa argumentiksitai parametreiksi vääriä tyyppejä. Operaatioiden palauttamien arvojenkanssa tilanne on sama. Käyttäjän tulee tietää, mitä operaatio palauttaa eri tilanteissa.Palautusarvojen tyypithän voivat vaihdella riippuen operaation argumentista<strong>ja</strong> parametreista. Tietojenkäsittelytaito<strong>ja</strong> huonosti hallitsevan käyttäjäntilanne on toivoton viimeistään kyselyissä, joissa täytyy metodin palauttamallearvolle soveltaa jotain toista metodia. Tällaiset kyselyt eivät välttämättäluonnistu virheettömästi edes kokeneemmalta ky<strong>selykielen</strong> käyttäjältä. Tässäkäänkyselykielessä ei päästä eroon rakenteessa navigoinnista tai strutkturointioperaatioidenkäytöstä. Toisin sanoen käyttäjän tulee tuntea tietokannassaolevien objektien rakenne. Yhteenvetona QAL-kyselykielestä voi sanoa, että seon ilmaisuvoimainen, mutta vaikea käyttää. Loppukäyttäjällä tulee olla kokemustaohjelmoinnista.3.3.3. ODMG 3.0 -standardiEdellä esittelemissäni kahdessa olio-orientoituneessa lähestymistavassa osakokonaisuussuhteeton mallinnettu siten, että luokan komponentit ovat komposiitinattribuutteina. Tällöin komposiitista päästään käsiksi komponenttiin,mutta komponentista ei päästä käsiksi sen komposiittiin. Olio-orientoituneellelähestymistavalle on yleistä tällainen mallintaminen [Junkkari, 2001]. Tästä seuraa,että komponentti ei sisällä informaatiota siitä, minkä kokonaisuuden osanase on. Moniin olio-orientoituneisiin tiedon esitystapoihin perustuen osan komposiittivoidaan löytää vain käymällä kaikki kompleksisia objekte<strong>ja</strong> sisältävätrakenteet läpi komposiitista komponenttiin. Etsimistä <strong>ja</strong>tketaan niin kauankunnes löydetään komposiitti, jolla on haluttu komponentti. Jos komponentistahalutaan suoraan kompositioon, tulee suhteet mallintaa jokaisessa luokassa


22kaksisuuntaisesti. Seuraavaksi tarkastelen standardia, jossa suhteetmallinnetaan tällä tavalla.ODMG:n (Object Data Management Group) tekemässä standardissa [Cattellet al., 2000] tyyppi määrittelee olion rakenteen <strong>ja</strong> käyttäytymisen. Käyttäytyminenmääritellään joukkona metodeita. ODMG:ssä oliotyypillä voi olla useampiavälittömiä yliluokkia. Tätä kutsutaan moniperiytymiseksi. Luokka voi siis periäominaisuuksia monilta luokilta. Oliot <strong>ja</strong> literaalit on eroteltu toisistaan Oliollavoi olla attribuuttien arvo<strong>ja</strong>, suhteita <strong>ja</strong> metode<strong>ja</strong>. Standardissa voidaan käyttäämyös ra<strong>ja</strong>pinto<strong>ja</strong>. Ra<strong>ja</strong>pintojen käytön mahdollisuus tukee sovelluksen rakentamista<strong>ja</strong> suunnittelemista toteutuksen yksityiskohdista välittämättä. Ra<strong>ja</strong>pintamekanismiavoi pitkälle vietynä kuitenkin kritisoida luokkien lukumäärienkasvulla [Koskimies, 2000]. Suhteiden mallintaminen tapahtuu määrittelemälläeksplisiittisesti suhteelle rajoite: suhde voidaan rajoittaa yksittäiseksi, joukkotyyppiseksitai listaksi. Suhteen rajoitteen lisäksi määritellään suhteen kohde.Tätä seuraa jokin kuvaileva suhteen nimi. Tämän lisäksi suhteelle määritelläänkäänteissuhde.Seuraavaksi esittelen esimerkkiä polkupyörän oh<strong>ja</strong>ussysteemistä, jossa etupyörän<strong>ja</strong> oh<strong>ja</strong>uksen välitön komponenttisuhde mallinnetaan ODMG-standardillaseuraavasti:class steering{relationship wheel has_componentinverse wheel is_component}Lihavoidulla kirjoitetut sanat ovat varattu<strong>ja</strong>. Luokan sisällä oleva ensimmäinenlause tarkoittaa, että steering-luokalla on wheel-luokka välittömänä komponenttinaan.Toisena lauseena on ensimmäisen käänteissuhde, eli wheel-luokka onkomponenttina steering:ssä. Suhteen mallinnus pitää tehdä myös wheelluokkaan.Wheel-luokassa siis määritellään suhde ilmaisulla ”relationship steeringhas_composite” sekä käänteinen suhde: ”inverse steering is_composite”.Jos oh<strong>ja</strong>uksella voisi olla useampia renkaita, joiden keskinäisellä järjestyksellä eiole merkitystä, relationship –termin si<strong>ja</strong>sta käytettäisiin relationship set –sanaa. Jos puolestaan oh<strong>ja</strong>uksella olisi useampi rengas <strong>ja</strong> niiden keskinäiselläjärjestyksellä olisi väliä, käytettäisiin varattua sanaa relationship list.Tämänkaltainen suhteiden mallintaminen on työlästä, koska suhteet joudutaanmallintamaan moneen kertaan. Se ei silti poista navigoinnin tarvetta,


23koska ODMG:ssä käytetään samaa OQL-kyselykieltä [Cluet, 1998], kuinedellä esitetyssä O 2-oliomallissakin. Koska suhteet on mallinnettu molempiinsuuntiin, navigointia voidaan harjoittaa kompositiosta komponentteihin, muttamyös päinvastoin. Luokan mallinta<strong>ja</strong> voi käyttää helposti tulkittavia suhteidennimiä, jolloin navigointi tulee käyttäjälle intuitiiviseksi. Ky<strong>selykielen</strong> käyttäjäntulee kuitenkin tietää suhteiden nimet. Tällöin ODMG:n suhteiden esitystapa eilopulta eroa käytettävyydeltään normaalista navigoinnista, jossa tämänkaltaistaesitystapaa ei käytetä. Ainoa etu suhteiden mallintamisessa ODMG:n tapaanonkin se, että kumpikin suhteen osapuoli tietää toisensa. Navigoinnin suuntaon siis kyselijän päätettävissä. Tästä ominaisuudesta on käyttäjäystävällisyydenkannalta hyötyä.Yhteenvetona olioperustaisista tietokannoista voidaan todeta, että ne tarjoavathyvät välineet osa-kokonaisuussuhteen mallintamiseen. Olioidentiteettienavulla voidaan osat <strong>ja</strong> kokonaisuudet yksilöidä helposti. Olioidentiteettienavulla voidaan luopua siis avaimien käytöstä, joka on arvo-orientoituneessamallintamisessa yksilöinnin mekanismina. Avaimet ovatkin turhia käsitteellisessämallintamisessa semanttisessa mielessä <strong>ja</strong> niitä käytetään vain <strong>toteutus</strong>mekanismina[Wand, 1999]. Metodien avulla voidaan hoitaa johdettujen attribuuttien<strong>toteutus</strong> <strong>ja</strong> muita hyödyllisiä toiminto<strong>ja</strong>. Oliotietokantojen heikkoudeksivoi kuitenkin laskea sen, että olioiden välisistä suhteista täytyy huolehtiakyselykielissä navigoinnin tai uudelleenstruktu-rointioperaatioiden avulla. Kokonaisuudensisäisiä suhteita ei siis tueta oliotietokannoissa riittävästi [Berahaand Su, 1999].3.4. Deduktiiviset tietokannatDeduktiivisissa tietokannoissa yhdistyy relaatiotietokantaan <strong>ja</strong> logiikkaohjelmointiinliittyviä tekniikoita [Liu, 1999]. Deduktiivisilla tietokannoilla on suuriilmaisuvoima. Säännöt määritellään logiikan sääntöjen avulla <strong>ja</strong> päättelykykynsäansiosta deduktiivisia tietokanto<strong>ja</strong> käytetään muun muassa tekoälysovelluksissa<strong>ja</strong> asiantunti<strong>ja</strong>järjestelmissä. Niillä voidaan määritellä myös transiitiivisensulkeuma, johon normaali relaatiomalli ei kykene. Deduktiivisuus on arvoorientoitunutlähestymistapa tiedon esittämiseen. Rakenteellisen tiedon esittäminenon helpompaa kuin relaatiomallilla, sillä osat voidaan mallintaa monimutkaisillaloogisilla termeillä. Logiikkaohjelmoinnin yhteyteen on kehiteltykonstruktoreita erityyppisiin tiedon esittämisen tarkoituksiin [Niemi and Järvelin,1991]. Niihin kuuluvat muun muuassa oliotietokantojen yhteydessä esitellyttuple- <strong>ja</strong> joukkokonstruktorit.Rakenteellisen tiedon esittäminen ei ole kuitenkaan yhtä helppoa kuin olioorientoituneisuudenyhteydessä. Monimutkaisten termien käsittely ei ole help-


24poa <strong>ja</strong> etenkin päivitykset ovat hankalia [Liu, 1999].Logiikkaohjelmoinnissa ei ole myöskään selkeää tapaa intensionaalisen <strong>ja</strong> ekstensionaalisentiedon erottelulle samassa merkityksessä kuin oliotietokantojenyhteydessä. Deduktiivisten tietokantojen yhteydessä intensionaalisella osallatarkoitetaan tietokannan johdettu<strong>ja</strong> tieto<strong>ja</strong>. Johdetut tiedot määritellään logiikansääntöjen avulla. Ekstensionaalinen taso tietokannasta koostuu tietokannassaolemassaolevasta tiedosta, johon sääntöjä sovelletaan [Niemi et al., 1998; Niemiet al., 2000]. Esittelen logiikkaohjelmoinnin peruskäsitteitä tutkielman myöhemmässävaiheessa.Deduktiivinen oliotietokanta on lupaava lähestymistapa. Siinä yhdistyyolio-orientoituneisuuden tiedon esitystapa <strong>ja</strong> logiikkaohjelmoinnin päättelykyky.Yksimielisyyttä siitä, mitä deduktiivinen olio-orientoituneisuus tarkoittaa,ei vielä ole muodostunut tiedeyhteisössä [Liu, 1999]. Näiden kahden paradigmanyhdistäminen ei ole yksinkertaista, koska lähestymistavat ovat hyvin erilaiset.Deduktiivinen olio-orientoituneisuus on valittu myös tutkielmassa esiteltävänky<strong>selykielen</strong> toteutuksen poh<strong>ja</strong>lle.


26Käyttäjältä ei voida edellyttää rekursion eikä iteraation käsitteellistäsisäistämistä. Tällöin kielen primitiivien tehtävänä on piilottaa loppukäyttäjältärekursiivisten <strong>ja</strong> iteratiivisten tilanteiden, kuten välillisten komponenttien <strong>ja</strong>komposiittien käsittelyt. Tämä ei ole itsestäänselvyys olemassaolevissa kielissä.Esimerkiksi eräät käyttäjäystävällisiksi tarkoitetut SQL-kielen laajennokset nf 2 –relaatiotietokantojen yhteydessä eivät pysty käsittelemään kuin ylintä komponenttihierarkiatasoa[Niemi and Järvelin, 1996].Kielen tulee tarjota kaksisuuntainen käsittely komponenttien <strong>ja</strong> komposiittienvälillä, kuten ODMG-standardissakin. Käsittelyssä ei kuitenkaan tule käyttäänavigointia. Käyttäjän pitää saada välilliset <strong>ja</strong> välittömät komponentti <strong>ja</strong>komposiitit sekä intensionaalisella-, että ekstensionaalisella tasolla ilman navigointia.Tämä ominaisuus lisää huomattavasti kielen käyttäjäystävällisyyttä.Tämänkaltainen navigointi mahdollistaa myös rakenteellisesti toisistaan poikkeavienosa-kokonaisuussuhteiden käsittelyn samassa kyselyssä.Kielen täytyy lisäksi tukea osa-kokonaisuussuhteelle luonteenomaistaominaisuuksien arvojen periytymistä tavalla, joka on käyttäjälle näkymätöntä.Komposiittien kohdalla kapseloinnin onkin katsottu olevan tärkeässä asemassakäyttäjäystävällisyyden kohottamisen kannalta [Civello, 1993]. Rakenteen analyysiähelpottaa myös, jos kieli tarjoaa primitiivejä osa-kokonaisuussuhteenmuiden erikoispiirteiden tarkasteluun. Tällaisia helpotuksia on muun muassaylimmän tason oliotyypin tai olioiden etsiminen. Samoin tulee pystyä hakemaanmyös perustyyppi <strong>ja</strong> oliot. Polkuesityksen saaminen tietyltä oliotyypiltäantaa puolestaan hyvän kuvan siitä, missä kohtaa osa si<strong>ja</strong>itsee rakenteessa. Ky<strong>selykielen</strong>mallintamisratkaisun pitää mahdollistaa myös samantyyppistenkomponenttien mallintamisen samassa rakenteessa, nf 2 -mallista poiketen.4.2. Eri tasojen tarkastelu kyselykielessäPuhtaasti intensionaalisilla kyselyillä tarkoitetaan tässä tutkielmassa kyselyitä,joilla haetaan informaatiota ainoastaan intensionaalisesta tasosta. Tällöin siiskyselyn vastaukset kuuluvat intensionaaliseen tasoon. Intensionaaliset kyselytovat tärkeitä esimerkiksi tilanteissa, joissa kyseltävien kohteiden kaaviotaso onkäyttäjälle entuudestaan tuntematon. Kaikki rakenteen analysointiin liittyvätkyselyt ovat intensionaalisia. Käyttäjä saattaa olla kiinnostunut esimerkiksi kyselynkohteen välillisistä tai välittömistä komponenteista tai komposiiteista.Myös kohteen ominaisuuksien selvittäminen kuuluu intensionaalisiin kyselyihin.Käyttäjä voi intensionaalisen kyselyn avulla saada selville, mitkä ovat kyseltävänkohteen komponentit <strong>ja</strong> komponenttien attribuutit. Myös tietyntyyppiseenkomponenttiin johtavien polkujen kysely kuuluu intensionaalisiin kyselyihin.Lisäksi peruskomponenttien <strong>ja</strong> ylimmän tason komponenttien selvittä-


27minen tapahtuu intensionaalisella tasolla kaavion perusteella.Intensionaalisten kyselyiden mahdollistaminen helpottaa käyttäjää, kun ky<strong>selykielen</strong>avulla on mahdollista lievittää kaaviotason tietojen muistamistaakkaa.Lisäksi intensionaaliseen tasoon kuuluvat kyselyt, jossa intensionaalisen tasontieto<strong>ja</strong> kysellään joidenkin ekstensionaalisten kriteerien perusteella. Jos esimerkiksihalutaan saada selville, missä oliotyypin ominaisuudessa esiintyy arvored, saamme vastaukseksi kriteerin täyttäviä oliotyyppejä. Tämänkaltainen intensionaalisentason analysointi on hyödyllinen myös käyttäjälle, jolle kaaviotasoon jo entuudestaan tuttu. Ekstensionaaliseen tasoon liittyvästä tiedosta voidaansiis jossain tilanteissa saada parempi kuva intensionaalisen vastauksenavulla [Motro, 1994].Vaikka kyselyn vastauksena saataisiin numeroarvo<strong>ja</strong>, voi kysely olla siltiintensionaalinen kysely. Tällaisesta tilanteesta on esimerkkinä kysely, joissavastaukseksi halutaan saada tietyn tyypin peruskomponenttien määrä. Tällöinarvo tarkoittaa rakenteeseen liittyvää lukumäärää.Ky<strong>selykielen</strong> tulee tukea myös ekstensionaalisia kyselyjä. Puhtaasti ekstensionaalisillakyselyillä tarkoitetaan tutkielmassa kyselyjä, joiden vastauksetsisältävät pelkästään ekstensionaalisen tason tieto<strong>ja</strong>. Intensionaalinen taso täytyytällöin olla käyttäjän tiedossa, jotta kyselyn tekeminen olisi mahdollista.Käyttäjän täytyy ilmaista kyselyssään attribuuttien tai luokkien nimet, joidenekstensionaalisen tason arvoista hän on kiinnostunut. Olennaista tässä kyselytyypissäon se, että vastaukseksi tulee ainoastaan ekstensionaalisen tason tietoa,kuten attribuuttien arvo<strong>ja</strong>. Tämän tapainen kyselytyyppi on tärkeä, sillä useinollaan kiinnostuneita tietokannan kuvaamien reaalimaailmassa olevien abstraktientai konkreettisten asioiden tiloista. Ekstensionaaliseksi kyselyksi luokitellaanmyös kysely, joka antaa tiettyjen intensionaalisten kriteerien perusteellapelkästään ekstensionaalista tietoa.Intensionaalis-ekstensionaalisilla kyselyillä tarkoitan tutkielman kielessäkyselyjä, joissa kyselyn tuloksena saadaan kumpaankin tasoon liittyviä tieto<strong>ja</strong>.Tällaista kyselyä edustaa seuraava esimerkki: Kyselyssä halutaan vastaukseksikokonaisuuden osat, osiin liittyvien ominaisuuksien nimet <strong>ja</strong> edelleen ominaisuuksiinliittyvät arvot. Tällöin vastaukseksi saadaan sekä intensionaalista ettäekstensionaalista tietoa. Vastaus muodostuu tällöin osan nimestä, siihen liittyvästäominaisuudesta <strong>ja</strong> ominaisuuden arvosta. Näistä kaksi ensimmäistä ovatintensionaalista tietoa <strong>ja</strong> viimeinen intensionaalista tasoa vastaavaa ekstensionaalistatietoa. Kysely havainnollistaa selkeästi, mihin käsitteeseen kukin arvoliittyy tietokannassa tietyllä a<strong>ja</strong>n hetkellä. Intensionaalis-ekstensionaaliset kyselytovat tavallisia esimerkiksi SQL:ssä. Siinä saadaan suurimmassa osassa kyselyjävastaukseksi intensionaalinen taso (relaation kaavio) <strong>ja</strong> vastaava ekstensio-


28naalinen taso (relaatio). Seuraavaksi esittelen tällaisen SQL-kyselyn. SQLkyselyssähaetaan tietoa kuvitteellisesta relaatiotietokannasta, jossa on bicyclerelaatio:select color, price from bicycle where price > 3000. Tämän kyselyn tuloksenasaadaan tulosrelaatio, jossa attribuuttien color <strong>ja</strong> price arvot tulostuvatattribuuttien nimien alle. Attribuutit haetaan bicycle-nimisestä relaatiosta <strong>ja</strong> ehtonaon, että vastaukseksi saatavien price-attribuuttien arvojen tulee olla suurempiakuin 3000. Vastaus voisi olla esimerkiksi seuraava:color price---------------------brown 4500white 3200red 7400Sarakkeiden niminä esitetään siis intensionaalinen taso <strong>ja</strong> rivit esittävät ekstensionaalisentason.Jokaisen kyselytyypin kohdalla on tässä tutkielmassa tarkasteltavassa kielessämahdollista tehdä edellä luonnehdittu<strong>ja</strong> yhdistettyjä kyselyjä. Tällöin vastauson jokin yllämainitun kolmen kyselytyypin mukainen. Jos halutaan esimerkiksisuorittaa puhtaasti ekstensionaalinen kysely, mutta intensionaalisestatasosta ei ole tarpeeksi tietoa, voidaan kysely suorittaa silti yhden kyselyn avulla.Kysely olisi voitu <strong>ja</strong>kaa myös kahteen erilliseen kyselyyn. Tällöin tehtäisiinensin kysely, josta kyselyyn tarvittava intensionaalinen tieto selviää. Tämänjälkeen suoritettaisiin erillinen ekstensionaalinen kysely edellisen kyselyn tietojenperusteella. Yhdistetyn kyselyn tekeminen on kuitenkin vaivattomampaa.Kahteen erilliseen kyselyyn <strong>ja</strong>kaminen on työlästä erityisesti tilanteissa, joissaensimmäinen kysely tuottaa suuren määrän vastauksia. Tällöin jälkimmäinenkysely joudutaan suorittamaan jokaiselle ensimmäisessä kyselyssä saadullevastaukselle.Seuraavaksi esittelen erityyppisiä kyselyjä lisää esimerkkien valossa, jottaniiden luonne <strong>ja</strong> käytännön merkitys tulisi selvemmin esille.4.3. Esimerkkejä intensionaalisista kyselyistäJos esimerkiksi venekor<strong>ja</strong>amon työntekijä haluaa saada selville, missä osassatietyssä venemallissa on pilssipumppu, hän on tällöin kiinnostunut venemalliinliittyvästä intensionaalisesta tiedosta. Pyörätehtaalla puolestaan saatetaan tarvitatietoa, kuinka monta mutteria tietyn pyörämallin komponenttiin tarvitaan,jotta niitä voitaisiin tilata sopiva määrä. Laivayhtiö voi tarvita tiedon, minkätyyppisiä hyttejä on laivan viidennellä kannella. Vastaus voidaan haluta vielä


29siten, että eri hyttityypit on <strong>ja</strong>oteltu erikseen <strong>ja</strong> tyyppejä vastaavat määrätovat tyyppien vieressä. Kahdessa viimeisessä kyselyssä saadaan arvo<strong>ja</strong> vastaukseksi.Kummassakin tapauksessa arvot on kuitenkin tuotettu intensionaaliseentietoon perustuen.4.4. Esimerkkejä ekstensionaalisista kyselyistäMonesti riittää tieto pelkästään kohdealueen ekstensionaaliseen tasoon liittyvistäseikoista. Esimerkiksi venekauppias saattaa tarvita tiedot kaikista veneensohvaverhoilukankaan mahdollisista väreistä, joita kyselyn a<strong>ja</strong>nkohtana on saatavilla.Pyöräkauppias voi puolestaan haluta tietokannastaan tulostettavaksikaikkien saatavilla olevien renkaiden koot. On hyvä huomata, että vaikkakauppias on edellä kiinnostunut pelkästään ekstensionaalisesta tasosta, hänentäytyy määritellä kyselytyyppi intensionaalisten käsitteiden avulla. Käsitteetovat joko tyyppejä tai tyyppien ominaisuuksia. Jotta voisimme esimerkiksi saadaky<strong>selykielen</strong> avulla tulostetuksi kaikkien kannassa olevien autojen hinnat,meidän täytyy luonnollisella kielellä ilmaistuna esittää asia seuraavasti: ”Annakaikki auto-tyyppisten olioiden hinta-attribuuttien arvot”. Tällöin tyyppi auto <strong>ja</strong>siihen liittyvä attribuutti hinta täytyy olla kyselyn suoritta<strong>ja</strong>n tiedossa jo ennenkyselyn suorittamista.4.5. Esimerkkejä intensionaalis-ekstensionaalisista kyselyistäOlemassaolevat kyselykielet antavat useimmiten intensionaalisekstensionaalisiavastauksia. Ensimmäinen esimerkki tämäntyyppisestä kyselystäoli aikaisemmin esitelty SQL-kysely. Toisena esimerkkinä tarkastelen kyselyä,jossa samalla kertaa saadaan kattava kuva osa-kokonaisuusrakenteesta <strong>ja</strong>yleiskuva ekstensionaalisesta tasosta: Tietokonekauppias haluaa saada selvillekaikkien emolevyjen alikomponentit, niiden attribuutit <strong>ja</strong> attribuuttien arvot.Tällöin siis vastauksessa on sekä intensionaalista että ekstensionaalista tietoa.Kolmanneksi esimerkiksi otan analysoivan kyselyn, jossa haetaan kaikkien osakokonaisuussuhteestalöytyvien ylimpien komposiittityyppien mukaisten ilmentymienmuoviosien yhteenlaskettu paino. Tällöin vastaukseksi tulee kaikkienkokonaisuuksien nimet, jotka ovat intensionaalista tietoa <strong>ja</strong> näitä vastaavatekstensionaaliset arvot, jotka kuvaavat yhteenlasketun painon summan.4.6. Esimerkkejä yhdistetyistä kyselyistäEdellisessä kappaleessa kerrottiin intensionaalis-ekstensionaalisista kyselyistä,jotka tuottivat kummankin tason tietoa vastaukseksi. Tämän lisäksi kappaleessatoisena esimerkkinä ollut kysely oli samalla myös yhdistetty kysely. Siinäkyseltiin emolevyjen alikomponentit <strong>ja</strong> niiden attribuutit, jotka olivat siis intensionaalistatietoa. Perinteisellä SQL-kielellä toteutettuna käyttäjällä olisi kuiten-


30kin täytynyt olla tieto alikomponenttien nimistä <strong>ja</strong>attribuuttien arvoista, jotta hän olisi voinut kysyä niiden ekstensionaalisen tasonarvo<strong>ja</strong>. Edellä olleessa esimerkissä käyttäjä kykeni suorittamaan kyselyn,vaikka rakenteelliset tiedot eivät olleetkaan selvillä.Toisena esimerkkinä otan venekauppiaan, joka haluaa saada selville, milläveneen pilssijärjestelmän alikomponenteilla on komponentteina muoviosia.Tässäkin tapauksessa tarvitaan kummankin tason tietojen yhdistämistä. Pilssijärjestelmänkomponentti on käsitteenä intensionaalinen, koska se on rakenteellistatietoa. Tieto alikomponenttien materiaalista on puolestaan ekstensionaalisellatasolla.Seuraavassa esimerkissä havainnollistan yhdistettyjä kyselyitä mahdollistavankielen etua erityisesti iteraatioon perustuviin kieliin verrattuna. Esimerkiksiotan lentokonevarikon, jolla on 100 lentokonetta. Suurimmalla osallalentokoneista on kolme moottoria. Tällöin moottorit ovat tyypiltään samanlaisia,mutta kaksi niistä on kiinni siipien alla <strong>ja</strong> kolmas peräosassa. Kyseisilläkolmen moottorin lentokoneilla ei ole kuitenkaan kaikilla samanlaista rakennetta.Joissain lentokoneissa moottori on voitu mallintaa johonkin lentokoneeseensuoraan pyrstön komponentiksi. Toisessa lentokonemallissa pyrstössä on kiinnimoottoriteline, johon moottori on kiinnitettynä. Kolmannessa moottori on rungonperäosassa kiinni. Varikon mekaanikko haluaa saada tietokannasta tietoakaikkien niiden lentokoneiden takamoottoreista, jotka ovat vuosimallia 1981.Iteraatiopoh<strong>ja</strong>isella kielellä, asian selvittäminen ei onnistuisi yhdellä kyselyllä,jos kyselyssä käytetään navigointia. Tämä johtuu siitä, että iteraatio käy kaikkilentokoneet läpi, perustuen samaan navigointipolkuun. Mekaanikon täytyisitällöin selvittää ensin joka lentokoneen kohdalla takamoottoriin johtava navigointipolku.Jos sen si<strong>ja</strong>an jokainen lentokone on mallinnettu siten, että niistä löytyy takaosa,kysely voidaan tehdä yhdellä yhdistetyllä kyselyllä. Mekaanikko voi ilmaistatällöin kielellä, että hän haluaa saada tiedot sellaisten moottorien ilmentymistä,joilla on komposiittina takaosa. Lisäksi samassa kyselyssä ilmaistaan vielä, ettätällaisten moottorien vuosimallin tulee olla 1981. Tällöin selvitetään ensin intesionaalisellatasolla moottorit, vaikka niiden tarkkaa si<strong>ja</strong>intia ei tiedetä. Tämävastaa navigointipolun selvittämistä <strong>ja</strong> on intensionaalista tietoa. Sitten rajoitetaanmoottoreita siten, että ainoastaan vuosimallin 1981 moottorit saadaan vastaukseksi.Tämä on ekstensionaalista tietoa. Samassa kyselyssä saatiin siis selvilleensin intensionaalinen tieto <strong>ja</strong> tämän jälkeen tätä tietoa hyväksikäyttäenkyselyssä voitiin määrittää ekstensionaaliset kriteerit <strong>ja</strong> saada ekstensionaalistatietoa.


314.7. Muita kielen vaatimuksia osa- kokonaisuussuhteidenkäsittelyynKielen käyttäjän tulee olla aina selvillä, mitä käsitteitä <strong>ja</strong> käsitetaso<strong>ja</strong> hän kyselyissäänkulloinkin käsittelee. Primitiivin nimen tulee selkeästi kuvata käyttötarkoitus<strong>ja</strong> se, mitä argumentte<strong>ja</strong> primitiivi käsittelee. Monikäyttöisiä primitiivejäei sallita. Tällä tarkoitetaan sitä, että jollekin primitiiville käyvät vain tietyntyyppiset argumentit. Primitiivejä, joiden käyttäytyminen vaihtelee argumentinsisällöstä riippuen ei kielessä sallita. Tällaiset primitiivit voivat olla tehokkaita,mutta ne voivat myös olla harhaanjohtavia, jos niitä ei hallitse kunnolla;käyttäjä voi saada tietämättään vääriä vastauksia.Ky<strong>selykielen</strong> ei tule myöskään sisältää QAL-kielen luonteisia-, malliin perustuviaprimitiivejä. Kaikki ohjelmointiin liittyvä käsitteistö, joka ei ole olennaistakyselyjen suorittamisen onnistumisen kannalta, on piilotettava käyttäjältänäkymättömiin. Täten käyttäjän ei tarvitse huolehtia olioidentiteettien käsittelystäeikä muista toteutukseen liittyvistä piirteistä.


325. Ky<strong>selykielen</strong> edellyttämä esitystapa5.1. Intensionaalisen <strong>ja</strong> ekstensionaalisen tason sitominen toisiinsaJotta intensionaalisen <strong>ja</strong> ekstensionaalisen tason sitominen toisiinsa mahdollistuisi,se edellyttää kummankin käsitetason tietojen eksplisiittistä esittämistä.Esitys tulee tehdä siten, että käsitetasolta on mahdollisuus siirtyä toiselle käsitetasollesaumattomasti. Tämän vuoksi tasot tulee pystyä integroimaan keskenään.Esitystavan tulee mahdollistaa intensionaalisen tason rakenteen kuvautuminensitä vastaavalle ekstensionaalisella tasolla oleville ilmentymille yksikäsitteisesti<strong>ja</strong> päinvastoin. Tällöin osa-kokonaisuushierarkioissa intensionaalisellatasolla olevista luokkien <strong>ja</strong> attribuuttien nimistä voidaan siirtyä käsittelemäänniitä vastaavia ekstensionaalisen tason olioita tai arvo<strong>ja</strong>.Kahden tason toisiinsa integrointiin käytetään Timo Niemen [1983] kehittämääindeksointimekanismia, jota on edelleen kehittäneet Niemi, Kalervo Järvelin<strong>ja</strong> Marko Junkkari erilaisiin tarkoituksiin kompleksisten rakenteiden mallintamisessa.Myös tämä tutkielma poh<strong>ja</strong>utuu keskeisesti tähän indeksointimekanismiin.Tutkielmassa esittelemäni kieli poh<strong>ja</strong>utuu erityisesti Marko Junkkarinformalismiin [2001], jossa indeksointimekanismia on sovellettu olioorientoituneeseenesitystapaan. Formalismin yhtenä keskeisenä motivaationaon mahdollistaa kyselykieli, jonka <strong>suunnittelu</strong>a <strong>ja</strong> prototyyppi<strong>toteutus</strong>ta tässätutkielmassa tarkastellaan. Tarkastelen seuraavaksi tätä formalismia.5.2. Olio-orientoitunut esitystapa osa-kokonaisuussuhteilleMarko Junkkarin [2001] esitystapa mahdollistaa intensionaalisen <strong>ja</strong> ekstensionaalisentason kiinteän sitomisen toisiinsa indeksointimekanismin <strong>ja</strong> joukkoopinavulla. Esitystavan tarkoituksena on myös osa-kokonaisuussuhteita sisältävienrakenteiden tehokkaan analysoinnin mahdollistaminen. Esitystapa perustuurakenteelliseen olio-orientoituneeseen mallintamiseen. Tällöin käyttäytymisnäkökulmaanei formalismissa oteta kantaa, joten esitystavassa olioilla eivoi olla metode<strong>ja</strong>. Teoria on <strong>toteutus</strong>kielestä <strong>ja</strong> ympäristöstä riippumatonta,koska se esitetään joukko-opin avulla.


33Osa-kokonaisuussuhteita sisältävä rakenne esitetään part-ofstructure element (lyhyesti PSE) –rakenteena, joka sisältää kompleksisen rakenteensekä ekstensionaalisen että intensionaalisen tason erikseen. Tiedot esitetääntavalla, joka mahdollistaa indeksien avulla tapahtuvan tasojen integroinnin.Yksi PSE-rakenne sisältää yhden osa-kokonaisuussuhteen kuvauksen <strong>ja</strong>sitä vastaavat ilmentymät. Komponenttitietokannalla tarkoitetaan kaikista tietokannassaolevista PSE-elementeistä muodostuvaa joukkoa.PSE-rakenne esitetään parina (Ext,N), jossa Ext on ekstensionaalinen <strong>ja</strong> Nintensionaalinen taso. Ekstensionaalinen taso on joukko, jonka alkioiden rakennemuodostetaan atomisista arvoista, olio-identiteetillä varustetuista tuplerakenteista<strong>ja</strong> joukoista. Atomisilla arvoilla ei ole rakennetta. Ne ovat jokomerkkijono<strong>ja</strong> tai luku<strong>ja</strong>. Nimiöidyllä tuplella on muoto oid, jossa x 1-x novat alkioita <strong>ja</strong> oid on tuplelle generoitu olioidentiteetti. Joukko esitetään tyyliin{x 1,x 2,…x n} missä x 1-x novat joukon alkioita. Joukko- <strong>ja</strong> tuplekonstruktorittulkitaan samoin, kuin edellä esitetyssä O 2 -oliomallissakin.Jokainen osa <strong>ja</strong> kokonaisuus on ekstensionaalisella tasolla kuvattu oliona.Niillä on täten yksikäsitteinen olioidentiteetti. Oliot esitetään tuple-rakenteenavulla. Vasemmalta oikealle mentäessä oliota esittävän tuplen alkiona on ensinattribuuttien arvot <strong>ja</strong> sitten olion mahdolliset komponentit. Jokaisella oliollapitää olla ainakin yksi attribuutti, jotta indeksointimekanismia pystytään soveltamaan.Komponentit esitetään joukon sisällä kokonaisuuden tuple-rakenteenalkioina. Joukko antaa mahdollisuuden useamman samassa roolissa olevankomponentin esittämiseen.PSE-esityksessä intensionaalinen taso esitetään binäärirelaationa, eli se sisältääjoukon järjestettyjä pare<strong>ja</strong>. Jokaisen parin ensimmäisenä elementtinä onjoko olion tyypin tai attribuutin nimi <strong>ja</strong> toisena elementtinä indeksi, joka liittyykyseiseen nimeen. Intensionaalisen tason esitystä N voidaan kutsua myös nimeämisrelaatioksi,joka kuvaa joukon indeksejä joukolle, joka muodostuu attribuuttientai olioiden tyyppien nimistä. Binäärirelaatiossa tietty indeksi liitetäänyhteen nimeen, mutta tiettyä nimeä voi vastata useita indeksejä.Havainnollistan formalismin esitystapaa Junkkarin [2001] esittämälläpolkupyöräesimerkillä. Käytän esimerkkiä myös myöhemmin ky<strong>selykielen</strong> toteutuksen,<strong>ja</strong> kyselyjen tekemisen yhteydessä. Kuva 2. esittää mallinnettavaa,tricyle-tyyppistä polkupyörää.


34Kuva 2: Tricyclen komponentitKuvasta 2. nähdään, tricycle:n rakenne. Tricycle voidaan <strong>ja</strong>kaa rakenteensa perusteellakarkeasti neljään osaan. Steering muodostaa yhden erillisen kokonaisuuden.Tricycle:n keskiosassa on saddle. Takaosa koostuu kahdesta wheel:istäsekä niiden välillä olevasta axle:sta. Frame pitää saddle:a <strong>ja</strong> rear:ia toisissaankiinni. On huomion arvoista, että rear <strong>ja</strong> steering ovat erityyppisessä osakokonaisuussuhteessaaikaisemmin esitetyn erottelun [Winston et al., 1987]mukaan. Rear <strong>ja</strong> tricycle on eroteltu mieluummin osa/osuus massasta –erottelulla, sillä rear on tavallaan osuus koko tricycle:stä. Sen si<strong>ja</strong>an steering onmieluummin jäsennetty komponentti/kokonaisuuden muodostava objekti erottelunmukaisesti. Tämä johtuu siitä, että steering:illä on toiminnallinen roolikolmipyörässä. Ei ole mitään sääntöä, joka pakottaisi a<strong>ja</strong>ttelemaan rear:in muodostuvankahdesta wheel:istä <strong>ja</strong> axle:sta. Myös steering olisi voitu jäsentää jollakinmuulla tavalla. PSE-esitystavalla voidaan mallintaa suhteet tarkoituksenmukaisiintulkintoihin perustuen. Tällöin tulee kuitenkin ottaa huomioon, että<strong>ja</strong>ottelussa osien <strong>ja</strong> kokonaisuuksien suhteiden kesken säilyy transitiivinen tulkinta.Seuraavaksi havainnollistan kuvan 2. tricycle:n osiin <strong>ja</strong>kamista Junkkarin[2001] esittämällä NF 2 -relaatioille tyypillisellä visualisoinnilla. Sillä on havainnollistaesittää sekä intensionaalinen että ekstensionaalinen taso. Kaavio muodostuuhierarkkisesta esittämistavasta, jossa kullakin tasolla on ensin mallinnettavanrakenteen nimi, jonka jälkeen välittömästi alempana on vasemmaltaoikealle mentäessä sen attribuuttien nimet <strong>ja</strong> näiden jälkeen sen mahdollisetkomponentit. Attribuuttien <strong>ja</strong> komponenttien nimien alapuolella on niitä vastaavaekstensionaalinen taso. NF 2 -relaatioiden esitystavasta taulukkoesityspoikkeaa siinä, että NF 2 -mallin sisäkkäiset relaatiot on taulukkoesityksessä korvattuolioilla/oliojoukoilla, joihin liittyy olioidentiteetti. Lisäksi samannimisiä


35oliotyyppejä on mahdollista esittää samassa osa-kokonaisuusrakenteessa, mikäei puolestaan ole mahdollista NF 2 -relaatioiden yhteydessä. Tilanpuutteen takiajoidenkin attribuuttien nimiä on lyhennetty. Attribuuttinimet Diam, W, H, L, B<strong>ja</strong> R_Type tarkoittavat vastaavassa järjestyksessä attribuutte<strong>ja</strong> Diameter, Weigth,Heigth, Length, Breadth <strong>ja</strong> Rim_type.TRICYCLEoid Priceo12100FRAMEoid Frame-No Materialo9 4566545 steelSADDLEoidPad oid H.o10 plastic o11 17STEERINGKuvassa 3. on selvyyden vuoksi harmaalla värillä sävytetty intensionaalinentaso <strong>ja</strong> valkoisella ekstensionaalinen taso. Esimerkkikaaviossa on siis vain yksitricycle:n ilmentymä. Jos ilmentymiä olisi useampia, ne olisivat valkoisessaosassa omilla riveillään. Ekstensionaalisella tasolla vasemmalta oikealle mentäessäkuvataan ensimmäiseksi tricycle-olion identiteetti (oid), jonka arvona onesimerkissä o12. Tämän jälkeen tulevat tricycle:n attribuutit, joita esimerkin tapauksessaon vain yksi eli Price. Attribuutin arvona on 100 ekstensionaalisellatasolla. Tämän jälkeen kuvataan tricycle:n komponentit, frame, saddle, steering <strong>ja</strong>rear. Kaikki tricycle:n komponentit, jotka ovat samalla myös kompositioita, esitetäänsamalla periaatteella kuin tricycle itsekin. Komponentit, jotka eivät olekompositioita, esitetään muutoin samalla tavalla kuin kompositiot, mutta luonnollisestiilman komponentte<strong>ja</strong>. Tällaisia perustyyppejä esimerkkikaaviossaovat front axle,handlebar,pedals,wheel,rear axle <strong>ja</strong> wheel.Visualisoinnissa intensionaalinen <strong>ja</strong> ekstensionaalinen taso on sidottu toisiinsaselkeällä tavalla. Intensionaalisen tason miltä tahansa kohdalta voidaansiirtyä tarkastelemaan sitä vastaavia ekstensionaalisia arvo<strong>ja</strong>. Myös toiseensuuntaan tarkastelu on mahdollista. Visualisoinnista näkee esimerkiksi sen, ettäarvoa 17 vastaa tricycle:n komponentin steering:in heigth-attribuutti intensionaalisellatasolla.PSE-esitystavassa taulukkoesityksen harmaa alue esitetään siis binäärirelaationa.Taulukon intensionaalisesta osasta huomataan sen olevan muodostettutavalla, joka luo mahdollisuuden liittää tietty indeksi sen jokaiselle attribuutille<strong>ja</strong> komponentille. Ylimpään kokonaisuuteen, eli tricycle:een, voidaan liittääindeksi . Kun mennään osa-kokonaisuushierarkiatasolta yksi taso alaspäin,indeksin pituutta kasvatetaan yhdellä, eli indeksi on tällöin muotoa , missäX on jokin kokonaisluku. Vasemmalta oikealle mentäessä X:n arvoa kasvate-FRONT AXLE HANDLEBAR PEDALS WHEELREAR AXLE WHEELoid B.oid L. oid B. oid Diam. oid Diam. R_type oid Diam. L. oid Diam. R_typeo2 6 unitedo5 4 o6 13 o7 5 o8 8 united o4 13 o1 0.5 12o3 6 unitedKuva 3. Kolmipyörän intensionaalisen <strong>ja</strong> ekstensionaalisen tason sisältävä taulukkoesitysREAR


36taan. Kolmipyörän tapauksessa vasemmalta oikealle mentäessä senensimmäisenä olevassa attribuuttissa (Price) arvotetaan yhdeksi <strong>ja</strong> seuraavaksitulevassa komponentissa (frame) X arvotetaan kahdeksi. Toisin sanoen priceattribuuttiavastaa indeksi <strong>ja</strong> frame:a . On huomionarvoista, ettäolioidentiteettiin ei liitetä indeksiä lainkaan, koska siihen ei liity osakokonaisuussuhteissaintensionaalisella tasolla omaa semanttista tulkintaa. Samallaperiaatteella front axle –komponentin length-attribuuttiin liitetään indeksi, sillä indeksi liittyy steering:iin <strong>ja</strong> indeksi steering:inkomponenttiin front axle:en, <strong>ja</strong> lopulta front axle:n ensimmäiseen <strong>ja</strong> ainoaan attribuuttiinlength indeksi . Indeksit kuvaavat sisäkkäisiä hierarkiataso<strong>ja</strong>,eli attribuuttien <strong>ja</strong> komponenttien si<strong>ja</strong>intia oliotyypissä/oliossa. Taulukkoesityksessäolevaan ekstensionaaliseen tasoon ei kuitenkaan pystytä indeksejähyödyntämään, sillä taso on esitetty tasaisena rakenteena. Kaaviossatasot on sidottu toisiinsa vain visuaalisesti.PSE-esitystavassa tieto on kuitenkin esitetty tavalla, jossa intensionaalisellatasolla esiintyvät indeksit on mahdollista liittää myös olioille <strong>ja</strong> attribuuttienarvoille. Ekstensionaalinen taso on esitetty PSE-esityksessä aiemmin esitetylläkolmella rakenteella. Tuple-rakenteen ansiosta ekstensionaalinen taso esitetäänsystemaattisesti siten, että se mahdollistaa indeksien soveltamisen. Tupleesityksessäjokaisella elementillä on positio, johon indeksissä olevalla kokonaisluvullavoidaan viitata. Tämän takia jokainen olio on kuvattu tuple-rakenteellaPSE-esityksessä. Tuple-rakenteen alkioina ovat attribuutin arvot <strong>ja</strong> oliot. Kuvassa3. tricycle:n rear-komponentissa wheel-oliotyyppi on esitetty vain kerran.Kuitenkin kuvassa wheel:iä vastaa kaksi ilmentymää ekstensionaalisella tasolla.Wheel-oliot esitetään siinä allekkain. Toisen olioidentiteetti on o2 <strong>ja</strong> toisen o3.Tämä ilmentää sitä, että rear-osassa wheel-käsitettä vastaa joukko wheel-olioita,joiden järjestyksellä ei ole väliä. Tässä tapauksessa joukossa on kaksi oliota.Niistä ei voi päätellä kumpi on vasemmanpuoleinen <strong>ja</strong> kumpi oikeanpuoleinenwheel-olio. Tällä tavalla pystytään kuvaamaan jäsen/kokoelma -suhdetta. PSEesitystavassatämänkaltainen tilanne on ratkaistu siten, että jokainen olio onjoukon sisällä. Oliojoukkoon liittyy aina vain yksi indeksi. Jos joukossa on useampiolio, tämä merkitsee sitä, että kaikkiin joukossa oleviin olioihin liittyy samaindeksi. Alla on Junkkarin [2001] antama PSE-esitys yllä olevasta tricycleesimerkistä.Ensin kuvataan ekstensionaalinen taso:{o12}, {o4}>}


37Yllä oleva ekstensionaalinen taso on formaali esitystapa kuvassa 3esitetylle ekstensionaalisen tason visualisoinnille. Tricycle-olio ilmaistaanuloimpien aaltosulkujen sisällä. Aaltosulut tarkoittavat joukkoa <strong>ja</strong> kuvattu ilmentymäon joukon ainoa alkio. Ilmentymä ilmaistaan kulmasuluilla, eli tuplerakenteena.Tuple varustetaan olioidentiteetillä. Koko tricycle:n olioidentiteettion siis o12, <strong>ja</strong> sen ainoan attribuutin arvona on 100. Kyseessä oleva arvo esiintyytuplen ensimmäisessä positiossa. Tämän jälkeen tulevat alkiot ovat joukko<strong>ja</strong>,joiden sisällä tricycle:n komponentit esitetään tuple-muotoisina. Tricycle:nkomponentit konstruoidaan samalla periaatteella. Tricycle:ä kuvaavan tuplenviimeisenä alkiona on joukko, jonka sisällä on kaksi oliota, joiden olioidentiteettinäovat o2 <strong>ja</strong> o3. Ne siis ovat rear-komponentin wheel-olioita. Tricycle-olioon,liitetään indeksi . Sen ensimmäiseen alkioon, eli Price-attribuutin arvoon100, liittyy indeksi . Vastaavasti attribuuttiarvoon steel liittyy indeksi.Alla on tricycle:n intensionaalisen tason formaali esitys. Binäärirelaatiostavoidaan selvittää esimerkiksi se, mikä on attribuuttiarvoa steel vastaava käsiteintensionaalisella tasolla. Koska ekstensionaalisella tasolla attribuuttiarvoonsteel voidaan liittää indeksi <strong>ja</strong> intensionaalisella tasolla attribuuttiin materialliitetään sama indeksi, on steel attribuutin material arvo.{, , ,, , , , , , ,, , ,, , ,, , ,, , ,


385.2.1. Indekseihin perustuva analysointi PSE-esitystavassaIndekseihin sisältyy runsaasti informaatiota osa-kokonaisuusrakenteesta, jostieto on järjestetty PSE-esityksen edellyttämällä tavalla. Intensionaalisen <strong>ja</strong> ekstensionaalisentason integroinnin lisäksi indeksien avulla voidaan suoraan analysoidarakenteellisuutta <strong>ja</strong> suhteita rakenteiden välillä. Tässä tutkielmassa indeksienanalysointia esitellään suppeasti <strong>ja</strong> yleisellä tasolla. Formaalimpi indeksienanalysointi on esitetty Junkkarin [2001] työssä.Indeksien demonstroimisessa käytän seuraavaa esitystä: Esitän indeksitmuodossa , missä x1-xn ovat kokonaisluku<strong>ja</strong>. Symbolit I1-Intarkoittavat mielivaltaisia indeksejä. Ne voivat siis myös olla tyhjiä indeksejä.Täten tarkoittaa indeksiä, jonka alkuna on indeksi I1 <strong>ja</strong> viimeisenä alkionax1. Indeksi tarkoittaa indeksiä, jossa indeksin I1 jälkeenesiintyvät alkiot x1 <strong>ja</strong> x2 peräkkäin. Tämän jälkeen tulee mielivaltainen indeksiI2, jonka jälkeen viimeisenä alkiona on x3. Jos siis x1 = 1, x2 = 2 <strong>ja</strong> x3 = 3, niinesimerkiksi indeksi olisi eräs yllä olevan indeksirakenteenhyväksymä indeksi.Indeksi I1 liittyy tyyppiin, jos PSE:stä löytyy muotoa oleva indeksi.Tämä johtuu siitä, että kaikilla tyypeillä on oltava vähintään yksi attribuutti.Attribuutti-indeksi on puolestaan sellainen indeksi, jolle ei ole löydettävissäsamasta PSE:stä samanalkuista, mutta pidempää indeksiä. Peruskomponentillekuvautuva indeksi I1 on sellainen, että kaikki muotoa olevat indeksitovat attribuutti-indeksejä. Tämä tarkoittaa siis sitä, että indeksiin kuvautuvallatyypillä ei ole komponentte<strong>ja</strong>. Tiettyä tyyppiä kuvaavan indeksin I1 komposiitti-indeksitovat indeksejä, jotka ovat alusta samanlaisia, mutta lyhempiä kuin. Esimerkiksi tyyppi-indeksin komposiitti-indeksit ovat , <strong>ja</strong> . Tietyn indeksin komponentti-indeksit ovat puolestaan sellaisia,jotka ovat alusta samanlaisia, mutta pidempiä <strong>ja</strong> lisäksi tyyppi-indeksejä.Esimerkiksi indeksin komponentti-indeksejä ovat <strong>ja</strong> , mikälimolemmat indeksit liittyvät tyyppeihin. Komponentti- <strong>ja</strong> komposiittiindeksithelpottavat myös transitiivisten yhteyksien selvittämistä.5.3. Ohjelmointikielen valinta ky<strong>selykielen</strong> toteuttamiseenJotta PSE-esitystavan poh<strong>ja</strong>lta voitaisiin ohjelmoida tietokoneelle toimiva kyselykieli,tarvitaan ohjelmointiparadigma, joka tukee esitystavan mukaista informaationesittämistä <strong>ja</strong> käsittelyä. Aikaisemmin totesin relaatiomallin, sen laajennoksenNF 2 -mallin <strong>ja</strong> olio-orientoituneiden tietokantojen olevan riittämättömiähelppokäyttöisen, mutta samalla ilmaisuvoimaisen ky<strong>selykielen</strong> vaatimuksille.


39Toteutuskielen tulee täyttää kaksi perusvaatimusta, jotta sen avulla PSEesitystapavoitaisiin siirtää helposti käytäntöön. Ensiksikin sen on hyvä ollaluonteeltaan deduktiivinen. Tämän johdosta pystytään tekemään korkean deklaratiivisenasteen omaava kyselykieli. Toiseksi kielen tulee tukea olioorientoitunuttaesitystapaa, joka on keskeisellä si<strong>ja</strong>lla PSE-esitystavassa. Toisinsanoen paradigma tarjoaa automaattisen olioidentiteetin generoinnin <strong>ja</strong> metodienmäärittelyn. Metode<strong>ja</strong> tarvitaan johdettujen attribuuttien mallintamisessa.Näitä vaatimuksia silmälläpitäen kielen <strong>toteutus</strong>välineeksi valittiin logiikkaohjelmointiparadigman<strong>ja</strong> olio-orientoituneisuuden paradigman piirteitä sisältävähybridikieli Prolog++. Kieltä voidaan pitää deduktiivisena olioorientoituneenaohjelmointiparadigmana [Moss, 1994]. Kielen valintaa tukevatmyös sen käytöstä saadut hyvät kokemukset deduktiivisten oliotietokantoihinperustuvan ky<strong>selykielen</strong> prototyyppitoteutuksen yhteydessä [Niemi et al.,2000]. Ennen kielen piirteiden esittelyä tarkastelen muutamia logiikkaohjelmointiparadigman<strong>ja</strong> Prologin peruskäsitteitä.5.3.1. LogiikkaohjelmointiLogiikkaohjelmointi perustuu nimensä mukaisesti logiikan sääntöihin. Logiikkaohjelmointion joukko fakto<strong>ja</strong> <strong>ja</strong> sääntöjä, jotka määrittelevät suhteita objektienvälille. Logiikkaohjelmassa määritellään faktojen <strong>ja</strong> sääntöjen avulla suljettumaailma, joka määrittelee siitä vedettävissä olevien johtopäätösten joukon. Logiikkaohjelmana<strong>ja</strong>minen tarkoittaa ohjelman faktojen <strong>ja</strong> sääntöjen määräämänsuljetun maailman poh<strong>ja</strong>lta tehtyä päättelyä [Sterling and Shapiro, 1986]. Logiikkaohjelmana<strong>ja</strong>minen suoritetaan tekemällä kyselyjä ohjelmalle. Kielenavulla on mahdollista toteuttaa kaikki relaatiotietokantojen esittämiseen <strong>ja</strong> käsittelyynliittyvät piirteet [Niemi and Järvelin, 1991; Paton et al., 1996]. Lisäksisillä pystytään määrittelemään rekursiivisia rakenteita, minkä johdosta transitiivistensuhteiden käsittely mahdollistuu. Logiikkaohjelmassa kaikki informaatioesitetään vakioista, muuttujista <strong>ja</strong> funktoreista koostuvina termeinä. Vakiotovat termejä, joita ei voi <strong>ja</strong>kaa pienempiin osiin. Muuttu<strong>ja</strong>lla esitetään mielivaltaistaargumentin arvoa. Tässä esityksessä pitäydyn Prologin tavassa merkitämuuttujia isoilla <strong>ja</strong> vakioita pienillä kir<strong>ja</strong>imilla. Logiikkaohjelman faktat ilmaisevatolion ominaisuuksia tai olioiden välillä vallitsevia suhteita. Tarkastellaanseuraavaa faktajoukkoa.putkimies(mikko).toimitusjohta<strong>ja</strong>(pekka).asuu(mikko,tampere).asuu(pekka ,rovaniemi).


40Kaksi ensimmäistä faktaa ovat yksipaikkaisia predikaatte<strong>ja</strong>. Faktojen nimet kirjoitetaanpienillä kir<strong>ja</strong>imilla. Logiikkaohjelmoi<strong>ja</strong> antaa faktoille tulkinto<strong>ja</strong>. Ensimmäinenfakta voidaan tulkitaan siten, että mikko on putkimies. Predikaatinnimenä on putkimies <strong>ja</strong> argumenttina mikko. Predikaatti voidaan tulkita myössiten, että putkimies on annettu ominaisuus <strong>ja</strong> mikko annettu objekti, jolla on kyseinenominaisuus. Kaksi jälkimmäistä faktaa ovat kaksipaikkaisia predikaatte<strong>ja</strong>,<strong>ja</strong> ne voidaan tulkita kahden objektin väliseksi relaatioksi. Jälkimmäiset kaksifaktaa voidaan tulkitaan siten, että ensimmäinen argumentti kuvaa henkilöä,joka asuu toisena argumenttina annetun objektin ilmaisemassa paikassa. Esimerkiksiviimeinen fakta voitaisiin kirjoittaa myös muodossaasuu(rovaniemi,pekka), mutta tulkinta pysyisi samana, jos logiikkaohjelmoi<strong>ja</strong>päättäisi, että ensimmäinen argumentti kuvaa asuinpaikkaa <strong>ja</strong> toinen argumenttiasu<strong>ja</strong>a. Tulkinta on siis ohjelmoi<strong>ja</strong>n vastuulla. Jos logiikkaohjelma muodostuuyllä olevista faktoista, voimme tehdä kyselyjä kyseessä olevaan logiikkaohjelmaanperustuen. Kysely ”putkimies(mikko)?” tuottaa vastaukseksi yesindikoimaan, että se on ohjelmasta vedettävissä oleva johtopäätös. Sen si<strong>ja</strong>ankysely ”putkimies(pekka)?” tuottaa vastaukseksi no. Myös muuttu<strong>ja</strong>a voi käyttääkyselyissä. Esimerkiksi kysely ”asuu(pekka,X)?” voidaan tulkita kyselyksi,missä pekka asuu. Vastaukseksi kyselyyn saadaan tällöin ”X = rovaniemi”. Kysely”asuu(X,Y)?” puolestaan antaisi kaksi vastausta,<strong>ja</strong>X = mikkoY = tampere,X = pekkaY = rovaniemi.Kyselyn prosessointi arvottaa siis muuttu<strong>ja</strong>t kaikilla mahdollisilla tavoilla, joillakysely on ohjelmasta vedettävissä oleva johtopäätös.Säännöt ovat logiikkaohjelmoinnissa tapa määrittää yhteyksiä objektien välille.Säännöillä on seuraava muoto: X


41Sääntö tulkitaan luonnollisen kielen ilmaisuna seuraavasti: jotta X on Y:nisoisä, täytyy löytyä henkilö Z, joka on Y:n vanhempi <strong>ja</strong> jonka isä X on. Sääntöedellyttää, että ohjelmasta löytyvät rungon tavoitteita vastaavat säännöt tai faktat.Sääntöjen soveltamisessa tarvitaan <strong>ja</strong>etun muuttu<strong>ja</strong>n ideaa. Tämä tarkoittaasitä, että säännön päässä <strong>ja</strong> rungon tavoitteissa oleva saman niminen muuttu<strong>ja</strong>tarkoittaa samaa objektia kaikkialla säännössä. Säännön rungossa olevilla pilkuillaon sama merkitys kuin konjunktiolla logiikassa.Rekursiivista määrittelyä demonstroidaan seuraavalla esimerkillä. Luonnollinenluku voidaan määritellä esimerkiksi seuraavalla, rekursiivisella tavalla:lluku(0).lluku(n(X))


42logiksi. Se on eräs tapa toteuttaa logiikkaohjelmana<strong>ja</strong>minenperäkkäiskäsittelyyn orientoituneella tietokoneella. Prolog prosessoi kyselyjenratkaisemisen yhteydessä lauseita niiden esittämisjärjestyksessä <strong>ja</strong> rungon tavoitteitavasemmalta oikealle. Prologilla ohjelmoitaessa ei siis päästä tästä syystätäysin eroon proseduraalisesta a<strong>ja</strong>ttelutavasta, vaan ohjelmoi<strong>ja</strong>n on otettavatämä ominaisuus huomioon. Joskus lauseiden <strong>ja</strong> tavoitteiden järjestys voimuuttaa ohjelman merkitystä. Prolog simuloi epädeterminististä valintaa samaistamisalgoritmin<strong>ja</strong> peruutuksen avulla [Sterling and Shapiro, 1986]. Lisäksilauseiden suoritusjärjestykseen voi vaikuttaa leikkaukseksi kutsutun menetelmänavulla.5.3.3. Prolog++Prolog++ on kieli, joka on rakennettu normaalin Prologin päälle lisäämällä siihenolio-ohjelmoinnin piirteitä. Se tukee esimerkiksi luokan, olion, luokan metodin<strong>ja</strong> periytymisen käsitteitä. Myös olio-ohjelmoinnista tutut suo<strong>ja</strong>usmääreetprivate <strong>ja</strong> public, voidaan antaa metodeille <strong>ja</strong> attribuuteille. Kieli tukee myöspoikkeuksien käsittelyä [Moss, 1994]. Kieli yhdistää siis logiikkaohjelmoinnilletyypillisen deklaratiivisuuden <strong>ja</strong> olio-orientoituneisuudelle tyypillisen mallintamisvoiman.Siksi sen on valittu tutkielmassa kehitetyn ky<strong>selykielen</strong> <strong>toteutus</strong>kieleksi.Prolog++:ssa luokka määritellään esittelemällä luokan nimi <strong>ja</strong> siihen liittyvätattribuutit <strong>ja</strong> metodit. Attribuutit ovat loogisia muuttujia, kuten Prologissayleensä. Metodit ovat puolestaan normaale<strong>ja</strong> Prolog–predikaatte<strong>ja</strong>, eli ne voivatolla fakto<strong>ja</strong> <strong>ja</strong> sääntöjä. Jos luokan komponentteina on muita luokkia, ne määritelläänilmaisulla parts osa1, osa2,…,osaN, jossa osat 1-N ovat muualla ohjelmassamääriteltyjä luokkia. Kun osia sisältävä luokan ilmentymä luodaan,myös sen osat luodaan samalla kertaa. Tämän ominaisuuden johdosta kielellävoidaan tehdä luonteeltaan vain poissulkevia komponentte<strong>ja</strong>. Luokan määrittämisendemonstroimisessa käytän aiemmin esitettyä kolmipyöräesimerkkiä.Käytän sitä myös myöhemmin Prolog-perustaista PSE-esitystapaa esiteltäessä.Esimerkki poikkeaa PSE-esimerkistä vain siinä, että tässä esimerkissä mukanaon myös metodi weigth, joka palauttaa osiensa painon summan.class tricycle.public instance attribute price.parts frame,saddle,steering,rear.weigth(X) :- frame#1


43Luokan määrittäminen aloitetaan class –sanalla, jota seuraa luokan nimi.Määrittely päätetään end -sanaan, jota seuraa uudelleen luokan nimi. Luokallaon julkisena attribuuttinaan price <strong>ja</strong> osina frame, saddle, steering <strong>ja</strong> rear. Weight onluokan metodi, joka hakee osiin liittyvät painot <strong>ja</strong> laskee ne yhteen.Esimerkin tricycle-luokan mukainen ilmentymä voidaan luoda seuraavasti:tricycle


44Kuvauskontruktori on tarkoitettu ilmaisemaan yhteydet kahden joukonelementtien välillä. Kuvausesitystavan matemaattisena taustakäsitteenä on binäärirelaatio.Kuvauskonstruktori on siis joukko, jonka alkioina on map-pare<strong>ja</strong>.Map-pari esitetään puolestaan yhditettynä terminä map(X,Y), missä termi Xkuvaa toisen joukon alkion <strong>ja</strong> termi Y toisen. On huomionarvoista, että termit X<strong>ja</strong> Y voivat olla myös monimutkaisen rakenteen sisältäviä Prolog-termejä.Tieto esitetään joukkona, jos on tarve mallintaa rakenteellisesti homogeenisiäalkioita sisältävä ryhmä, jonka alkioiden järjestyksellä ei ole merkitystä. Valitettavastistandardi Prolog ei tarjoa joukkoa esittävää tietorakennetta [Liu,1999]. Tämän vuoksi joukkojenkin esittämiseen käytän muun muuassa Niemen<strong>ja</strong> Järvelinin [1991] ehdottamaa esitystapaa. Siinä joukot esitetään listoina. Tätävalintaa tukee muun muassa monet listoille määritellyt systeemipredikaatit.Esimerkiksi predikaattia member(X,L) voidaan soveltaa tutkimaan, kuuluukoalkio X joukkoon L.Edellä mainitsemieni kolmen konstruktorin avulla voidaan PSE-esitystapaesittää Prolog-perustaisesti. Kuten yllä todettiin, esitystapa joudutaan lisäksiintegroimaan Prolog++:n mukaisten olioiden kanssa. PSE-formalismin [2001]tapa esittää oliot joukko-opillisesti ei ole riittävä. Tämä johtuu siitä, että olioilletäytyy mallintaa metode<strong>ja</strong>, jotka mahdollistavat osa-kokonaisuussuhteelle tyypillisenperiytymismekanismin toteuttamisen. Tämän vuoksi olioiden tulee olladynaamisina tietokoneen muistissa ajon aikana. Olioita haetaan muististaoliotunnisteiden avulla. Tieto oliotunnisteista tulee siis olla olioita esittävissätermeissä. Nämä olion, <strong>ja</strong> sitä vastaavan termin integroinnin seikat tulee ottaahuomioon luokkaa määriteltäessä.5.4.1. Esitystavan edellyttämän olion <strong>ja</strong> luokan piirteetIntensionaalisen <strong>ja</strong> ekstensionaalisen tasojen toteuttamisessa tulee ottaa huomioontasojen integroinnin yhteydessä esiintyvät tekniset vaatimukset. Intensionaalinentaso esitetään Prolog-terminä sen jälkeen, kun Prolog++ luokka onensin määritelty sille. Esimerkkinä käytän aiemmin esittelemääni tricycleesimerkkiä.Erona Junkkarin esittämään tricycle:en on kuitenkin se, että kaikissasen komponenttityypeissä on attribuuttina weigth. Weigth on johdettu attribuuttikaikissa tricycle:n kompositiotyypeissä, siis myös itse tricycle-oliotyypissä.Perusoliotyypissä weigth on normaali attribuutti, jota ei johdeta mistään. Intensionaalisessatasossa weigth esitetään kuitenkin myös komposiittienkin kohdallanormaalina attribuuttina, johon liittyy attribuutti-indeksi. Alla on intensionaalisentason Prolog-perustainen <strong>toteutus</strong> kuvan 2. tricycle:stä.


45pse([map(tricycle,t(1)),map(price,t(1,1)),map(weigth,t(1,2)),map(frame,t(1,3)),map(saddle,t(1,4)),map(steering,t(1,5)),map(rear,t(1,6)),map(frame_no,t(1,3,1)),map(material,t(1,3,2)),map(weigth,t(1,3,3)),map(pad,t(1,4,1)),map(weigth,t(1,4,2)),map(h,t(1,5,1)),map(weigth,t(1,5,2)),map(front_axle,t(1,5,3)),map(handlebars,t(1,5,4)),map(pedals,t(1,5,5)),map(wheel,t(1,5,6)),map(b,t(1,6,1)),map(weigth,t(1,6,2)),map(rear_axle,t(1,6,3)),map(wheel,t(1,6,4)),map(l,t(1,5,3,1)),map(weigth,t(1,5,3,2)),map(b,t(1,5,4,1)),map(weigth,t(1,5,4,2)),map(diam,t(1,5,5,1)),map(weigth,t(1,5,5,2)),map(diam,t(1,5,6,1)),map(r_type,t(1,5,6,2)),map(weigth,t(1,5,6,3)),map(b,t(1,6,1)),map(weigth,t(1,6,2)),map(diam,t(1,6,3,1)),map(l,t(1,6,3,2)),map(weigth,t(1,6,3,3)),map(wheel,t(1,6,4)),map(diam,t(1,6,4,1)),map(r_type,t(1,6,4,2)),map(weigth,t(1,6,4,3))]).Intensionaalista tasoa esittävän Prolog-termin funktorina on atomi pse. Intensionaalisentason binäärirelaation esitän kuvaustyyppisenä rakenteena. Siinämap-parin ensimmäisenä elementtinä on attribuutin tai olion tyypin nimi <strong>ja</strong> toisenasiihen liittyvä indeksi. Esitän indeksin tuple-konstruktorina. Esimerkkinäon vain tricycle:n intensionaalisen tason esitys. Jos intensionaalisella tasolla olisimallinnettava muitakin osa-kokonaisuussuhteita, niin ne olisivat omina listoinaanpse-termin elementteinä.Aikaisempi tricycle:ä kuvaava Prolog++:lla kuvattu luokka ei ole riittäväekstensionaalisen tason esittämiseen. Luokaa muodostettaessa täytyy kyetäluomaan PSE-formalismin ekstensionaalinen esitystapa. Toisin sanoen oliontäytyy pystyä muodostamaan itsestään PSE-esitystavan mukainen ekstensionaalinenesitys. Prolog-esityksen tulee olla lisäksi sellainen, että sitä voidaanhyödyntää Prolog++:n yhteydessä. Tämä tarkoittaa sitä, että ekstensionaalisentason termiesityksestä tulee pystyä siirtymään muistissa olevaan olioon.Jotta olio pystyy muodostamaan Prolog-esityksen itsestään, täytyy oliotavastaavassa luokassa määritellä metodi, joka koostaa olion osista oikeanlaisenesityksen. Määrittelen metodin siten, että kaikki oliot tulostavat itsestään tuplerakenteen.Termin nimenä on merkkijono, jonka alku muodostuu t-kir<strong>ja</strong>imesta.Tämä vain siksi, että t-kir<strong>ja</strong>in osoittaa kyseessä olevan tuple-konstruktorin. Välittömästit-kir<strong>ja</strong>imen jälkeen merkkijonossa on oliota vastaavan luokan nimi.Tämän jälkeen merkkijonossa on olioidentiteetti. Jos kyseessä on perusolio, oliomuodostaa itsestään tuple-rakenteen, jonka sisältönä ovat olioiden attribuuttienarvot. Jos sen si<strong>ja</strong>an on kyse kompositiosta, tuple-esityksen sisällä on attribuuttienjälkeen alkioina sen komponenttien esitys tuple-rakenteena. Kompositioidenkohdalla rakenne muodostetaan siis rekursiivisesti. Rakenteen rekursiivi-


46nen muodostaminen määritellään siten, että komposition muodostaessaitseänsä se ensin muodostaa komponenttinsa. Nämä puolestaan antavat tulostuskäskynomille komponenteilleen <strong>ja</strong> niin edelleen, ellei kyseessä ole perusolio.Perusolion kohdalla muodostaminen loppuu, sillä perusoliot koostuvatvain omien attribuuttiensa arvoista. Tällä tavalla ylimmän tason olio koostaatermin koko kokonaisuudesta. Alla esitän print-metodin tähän tarkoitukseen.Metodi pitää lisätä aikaisemmin Prolog++:n yhteydessä esittämääni tricycleluokanmääritykseen. Muuten ekstensionaalisen tason PSE-termin muodostaminenajon aikana ei ole mahdollista.print(X):-(Class|No) = self,name(Class,Casc), name(No,Noasc), append(Casc,Noasc,Result1),name(t,Te), append(Te,Result1,Result),name(Oid,Result), frame#1


47ta tiettyä arvoa tai oliota vastaava indeksi tai indeksit selville. Nämäkaksi Prolog-termiä mahdollistavat intensionaalisen <strong>ja</strong> ekstensionaalisen tasonkaksisuuntaisen vuorovaikutuksen.Oletetaan, että halutaan selvittää frame_no –attribuutin arvo. Tällöin selvitetäänensin intensionaalisen tason esityksestä se indeksi, johon frame_no liittyy.Vastaukseksi saadaan tässä tapauksessa indeksi t(1,3,1). Jos frame_no:oon olisiliittynyt useampia indeksejä, olisivat myös nämä indeksit tulleet vastaukseksi.Tämän jälkeen haetaan ekstensionaaliselta tasolta indeksiä t(1,3,1) vastaava arvo.Koska esimerkin yhteydessä on esiteltynä vain yksi ilmentymä, vastaukseksitulee 4566545, sillä se on rakenteessa indeksin osoittamassa paikassa.Jos oltaisiin haluttu saada oliotyyppiä frame vastaavat ekstensionaalisen tasonrakenteet, systeemi olisi etsinyt kaikki frame:en liittyvät indeksit intensionaalisentason esityksestä. Niitä olisi ollut tässäkin tapauksessa jälleen vain yksi(indeksi t(1,3)). Tämän jälkeen ekstensionaaliselta tasolta olisi löytynyt indeksiävastaava rakenne tframe53617(4566545,steel,4). Jos halutaan käsitellä terminmukaista oliota, tarvitaan siihen tarkoitukseen suunnittelemaani predikaattia,joka muuttaa esityksen Prolog++ -mukaiseksi olioesitykseksi. Predikaattimuuntaa tuplen nimeä esittävän merkkijonon siten, että se poistaa t-kir<strong>ja</strong>imennimestä <strong>ja</strong> irrottaa kir<strong>ja</strong>inosuuden numero-osuudesta. Lopuksi esitys viimeistelläänsuluilla <strong>ja</strong> | -merkillä. Lopputulokseksi yllä olevasta frame-rakenteestasaadaan oliotunnus (frame|53617), jota käytetään viitattaessa muistissa olevaanolioon. Oliotunnuksen selvittämisen jälkeen oliota käsitellään normaalisti, koskakaikki sen metodit <strong>ja</strong> attribuutit ovat käytettävissä.Siirryttäessä ekstensionaaliselta tasolta intensionaaliselle tasolle tarvitaanpredikaattia, joka kykenee antamaan ekstensionaaliselta tasolta indeksit, jotkaliittyvät tiettyihin arvoihin tai olioihin. Predikaatti tuottaa myös useammanindeksin tarvittaessa. Jos esimerkiksi halutaan saada arvoon 6 liittyvä intensionaalisentason vastinkäsiteet selville, kolmipyörän ekstensionaalisen tason esityksestä,saadaan vastaukseksi indeksi t(1,6,4,1). Tämän jälkeen Prolog-ohjelmaetsii indeksiä vastaavan nimen intensionaalista tasoa vastaavasta binäärirelaatioesityksestä.Vastaukseksi esimerkin yhteydessä saadaan attribuutti diam. Onhuomionarvoista, että arvo olisi voinut esiintyä useammassa kohtaa ekstensionaalisellatasolla, jolloin kaikkien kohtien indeksit olisivat tulleet vastaukseksi.Prolog++ esitystapa edellyttää seuraavia suoritusvaiheita osakokonaisuussuhteitasisältäviä rakenteita toteutettaessa: Ensin mallinnetaanluokka normaalin olio-orientoituneisuuden mukaisesti Prolog++:lla. Tällöinmallinta<strong>ja</strong> päättää, periytyykö luokka mahdollisesti jostain yläkäsitteestä, <strong>ja</strong>mitä attribuutte<strong>ja</strong> <strong>ja</strong> metode<strong>ja</strong> luokalle määritellään. Tämän lisäksi luokallemääritellään sen mahdolliset osat. Osien tulee olla luokkia, jotka on määritelty


48Prolog-ohjelmassa aikaisemmin kuin niiden kompositio. Tämän jälkeenjohdetut attribuutit muodostetaan metodien avulla. Johdettujen attribuuttienvaatimuksena on se, että ne ovat yksipaikkaisia metode<strong>ja</strong>. Metodin ollessa yksipaikkainensitä voidaan soveltaa Prolog++:ssa samalla tavalla kuin attribuutte<strong>ja</strong>kin.Tällöin käyttäjän ei tarvitse tietää, onko kyseessä johdettu- vai normaaliattribuutti. Edellä olleet tehtävät riippuvat kulloisestakin sovellutusalueesta,missä kyselykieltä tullaan käyttämään. Näiden vaiheiden lisäksi prototyyppitoteutuksessaon suoritettava manuaalisesti sekä tulostusmetodin määrittäminenluokkaan, että intensionaalisen esityksen laatiminen. Tulevaisuudessa tämä työon tarkoitus saada käyttäjälle automaattiseksi tai graafisella käyttöliittymälläsuoritettavaksi. Myös ensimmäisen pakollisen vaiheen tulostusmetodin saamistaautomaattiseksi tutkitaan <strong>ja</strong>tkossa.5.4.3. PSE-tietokannan kuvaus <strong>ja</strong> esimerkkitietokantaTietokannan tulee sisältää kaikkien ylimpien tasojen oliotyyppien (top-type)intensionaalinen kuvaus aiemmin esitetyllä tavalla. Oletetaan, että tietokantakoostuu kahdesta polkupyörätyypistä, aiemmin esitetystä tricycle:stä <strong>ja</strong> lisäksiJunkkarin [2001] työssä esitetystä bicycle:stä. Tällöin tietokantaan totetutetaanniihin liittyvät intensionaalisen tason esitykset. Intensionaalista tasoa ei siis oletarkoitus esittää kaikista tricycle:n <strong>ja</strong> bicycle:n alikokonaisuuksista itsenäisinäkuvauksina. Jos sen si<strong>ja</strong>an pyörien alikokonaisuuksia luodaan itsenäisinä osina,tulee myös alikokonaisuuksien intensionaalinen esitys toteuttaa erikseen.Seuraavaksi esittelen esimerkkitietokannan, joka koostuu kolmesta tricycleoliosta<strong>ja</strong> kolmesta bicycle-oliosta. Tricycle-luokan osa-kokonaisuusrakenne onsama, kuin aikaisemmissa esimerkeissä. Tällöin tricycle:llä oli ainoastaan yksiilmentymä. Tarkastelen myöhemmin esiteltäviä esimerkkikyselyjä tähän esimerkkitietokantaanperustuen. Esimerkkitietokannan <strong>toteutus</strong> muodostuu siiskahdesta intensionaalisen tason Prolog-esityksestä <strong>ja</strong> kuudesta ekstensionaalisentason Prolog-esityksestä. Prolog-termeinä tietokantaa ei tässä yhteydessäenää esitetä, koska termit ovat <strong>toteutus</strong>rakenteita, joista ky<strong>selykielen</strong> käyttäjänei tarvitse olle selvillä. Sen si<strong>ja</strong>an havainnollistan tietokantaa aikaisemmin käyttämällänisisäkkäisten taulukoiden mukaisella visualisointitavalla. Visualisoinnistaon jätetty tilankäytön vuoksi johdettu attribuutti weigth pois, vaikkase oletetaan esimerkkikyselyissä olevan mukana. Weigth on siis jokaisella PSEesityksenkompositiolla johdettuna attribuuttina <strong>ja</strong> se on toteutettu metodinavulla. Perusoliotyypeillä weigth on normaali attribuutti. Ennen bicycle-osakokonaisuussuhteentaulukkoesitystä havainnollistetaan bicyclen rakenne kuvassa5.


49FRAMESADDLETRICYCLESTEERINGKun siis olio luodaan, se luo itsestään Prolog-esityksen, joka vastaa kuvissa 4 <strong>ja</strong>6 olevalla visualisointitavalla esitettyä yhtä valkoisella visualisoitua riviä.Tietokanta sisältää siis kaikki osa-kokonaisuussuhteiden intensionaalisetesitystavat. Tästä seikasta koituu ongelma silloin kun tietokannassa on paljonosa-kokonaisuussuhteita, joilla on samannimisiä komponentte<strong>ja</strong>. Oletetaan tilanne,jossa tietokanta muodostuu kahdesta polkupyörätyypistä. <strong>ja</strong> halutaantarkastella ainoastaan tricyclen rakennetta. Jos halutaan saada esimerkiksi tricy-oid PriceFRONT AXLE HANDLEBAR PEDALS WHEELREAR AXLEWHEELoid Frame-No Material oid Pad oid H.oid B.oid L. oid B. oid Diam. oid Diam. R_type oid Diam. L. oid Diam. R_typeo2 6 unitedo12 100 o9 4566545 steel o10 plastic o11 17 o5 4 o6 13 o7 5 o8 8 united o4 13 o1 0.5 12o3 6 unitedo23 5 solido13 250 o14 6534264 steel o15 leahter o16 16 o17 3 o18 14 o19 7 o20 9 solid o21 12 o22 0.6 13o24 5 solido34 7 unitedo25 400 o26 5435534 aluminium o27 rubber o28 19 o29 4 o29 12 o30 6 o31 7 united o32 14 o33 0.5 13o35 7 unitedREARKuva 4: Tricyclen intensionaalinen taso <strong>ja</strong> sen kolme ilmentymää.Kuva 5: Bicycle:n komponentitFRAMEDRIVE GEARBICYCLESTEERINGoid PriceCHAIN CAIN RING PEDALSFRONT AXLE HANDLEBAR WHEELoid Frame-No Mat. W. oid C_typeoid Mat. W. oid H. oid Diam R_typeoid L. W. oid Diam W. oid Diam W. oid L. W. oid B. W. oid Diam R_type W.o14 10 0.5o37 500 o27 8265 steel 10 o28 1-speed o13 40 0.5 o16 10 0.5 o29 leather 0.5 o30 39 o17 26 1 o18 20 1 o19 26 spoke 2 o31 26 spokeo15 4 0.2o21 9 0.5o38 400 o32 43285 steel 8 o33 1-speed o20 39 0.5 o23 7 0.5 o34 plastic 0.5 o35 30 o24 20 1 o25 20 1 o26 20 spoke 2 o36 20 spokeo22 4 0.2o43 9 0.5o39 400 o40 43277 steel 8 o41 1-speed o42 39 0.5o45 8 0.5 o46 plastic 0.5 o47 30 o48 20 1 o49 20 1 o50 20 spoke 2 o51 20 spokeo44 4 0.2SADDLEKuva 6: Bicycle:n intensionaalinen taso <strong>ja</strong> sen kolme ilmentymää.WHEEL


50cle:n polkimien komposiitit kyselyn vastaukseksi, kyselyn tuloksenasaataisiin molempien polkupyörätyyppien polkimien komposiitit. Ongelmaesiintyy tilanteessa, jossa molempien polkupyörätyyppien polkimet on mallinnettusamalla nimellä. Tämän takia kieleen on toteutettu primitiivi, jolla käyttäjävoi määrätä, minkä kokonaisuuksien suhteista hän on kiinnostunut. Tällöinkäyttäjä voi ottaa kyselyn tarkastelun kohteiksi esimerkiksi vain yhden osakokonaisuussuhteen.Oletuksena kyselyissä käytetään koko tietokannan sisältämiäosa-kokonaisuussuhteita. Ekstensionaalisella tasolla ongelmaa ei esiinny,sillä oliot ovat aina yksikäsitteisiä.


516. Kielen primitiivit <strong>ja</strong> esimerkkikyselyt6.1. Kielen syntaksiin vaikuttavia tekijöitäKielen primitiivien tulee olla sellaisia, että niitä yhdistelemällä saadaan aikaanilmaisuvoimaisia kyselyjä. Kieli on yritetty pelkistää mahdollisimman yksinkertaiseksi,jotta kieli olisi helppokäyttöinen. Kielen <strong>suunnittelu</strong>a oh<strong>ja</strong>sivat seuraavatperiaatteet: helppokäyttöisyys, tietokoneen rajoitukset, riittävä ilmaisuvoima<strong>ja</strong> primitiivien mahdollisimman vähäinen määrä. Viimeinen vaatimus onsiksi, että primitiivien ulkoa muistaminen ei koituisi vaikeaksi. Lisäksi primitiivienhyödyntäminen on vaikeaa jos käyttäjä ei hahmota, kuinka yhdessä kyselyssävoidaan ilmaista vaativakin kysely yhdistelemällä primitiivejä keskenään.Yllä olevat neljä vaatimusta ovat keskenään osittain ristiriitaisia, <strong>ja</strong> tämän vuoksitehtävä ei ole helppo.Kieli perustuu <strong>ja</strong>etun muuttu<strong>ja</strong>n ideaan <strong>ja</strong> korkealla abstraktiotasolla oleviinperusprimitiiveihin. Jaetun muuttu<strong>ja</strong>n idealla tarkoitetaan samaa, kuin logiikkaohjelmoinninyhteydessä. Tämän lisäksi syntaksissa on käytettävissä logiikankäsitteet konjunktio, disjunktio sekä sulut. Näiden käsitteiden avulla tulee voidamuodostaa kaikki kielen lailliset kyselyilmaisut.Syntaksissa isolla kirjoitetut kir<strong>ja</strong>imet merkitsevät muuttujia <strong>ja</strong> pienellä kirjoitetutsanat kielen primitiivejä tai vakioita. Pilkku tarkoittaa konjunktiota, elise merkitsee loogista käsitettä <strong>ja</strong>. Disjunktion tapauksessa käytetään puolipistettä<strong>ja</strong> se tarkoittaa loogista käsitettä tai. Sulku<strong>ja</strong> käytetään kyselyn sisäisensuoritusjärjestyksen vaihtamiseen.Käyttäjän tulee kaikkiaan hallita siis edellä mainitsemani loogiset peruskäsitteet<strong>ja</strong> kielen perusprimitiivit. Kielessä olevat loogiset käsitteet ovat helppo<strong>ja</strong>,eikä niiden omaksuminen edellytä logiikan opiskelemista. Jaetun muuttu<strong>ja</strong>nidea on myös helppo ymmärtää. Kielen primitiivien demonstroinnissa, käytänedellisessä kappaleessa esittelemääni esimerkkitietokantaa. Samaa esimerkkiäkäytetään myös kyselyjen demonstroinnissa.6.2. Kielen primitiivitKielen primitiivien tehtävänä on mahdollistaa itsenäisesti miellettävien kyselynosien määrittely. Jos kysely on yksinkertainen, yhdenkin primitiivin käyttö voiriittää. Kysely muodostetaan primitiiveillä, joissa käytetään muuttujia <strong>ja</strong> vakioita.Tässä tutkielmassa primitiivin argumenteilla tarkoitan muuttujia tai vakioita,jotka ovat primitiivin käsittelyssä. Pilkulla <strong>ja</strong> puolipisteellä yhdistellään


52primitiivit toisiinsa kyselyssä. Jos primitiivi käsittelee kahtaargumenttia, argumentit sijoitetaan primitiivin kummallekin puolelle. Yhdenargumentin primitiivin tapauksessa argumentti sijoitetaan primitiivin välittömäänläheisyyteen jommalle kummalle puolen primitiiviä. Argumentti voi ollamyös tietyissä primitiiveissä listarakenteinen. Lisäksi yksi primitiivi toimii relaatioalgebranvalintaoperaation tapaan <strong>ja</strong> se esitellään myöhemmin tarkemmin.Kielen primitiivit voidaan <strong>ja</strong>kaa käyttötarkoituksensa perusteella kolmeenryhmään: intensionaalisen tason- <strong>ja</strong> intensionaalis-ekstensionaalisen tason käsittelyprimitiiveihinsekä muihin primitiiveihin. Muut primitiivit eivät liity itseosa-kokonaisuussuhteen analysointiin. Niillä on silti tärkeä rooli kyselykielessä.6.2.1. Intensionaaliset primitiivitKielessä on yhteensä kahdeksan intensionaalista primitiiviä. Alla luetellaan kyseisetprimitiivit. Arg1 <strong>ja</strong> arg2 tarkoittavat primitiivien argumentte<strong>ja</strong>.1. arg1 is_composite_type_of arg22. arg1 is_component_type_of arg23. arg1 is_top_type4. arg1 is_basic_type5. arg1 is_property_of arg26. arg1 is_path_to arg27. common_component arg18. common_components arg1.Kyselyjen oletetaan kohdistuvan sekä tricycle:n että bicycle:n osakokonaisuussuhteisiin,jos muuta ei mainita.Ensimmäisen primitiivin pääkäyttötarkoitus on komposiittityypin etsiminenjollekin osalle. Primitiivin avulla saadaan selville sekä välilliset, että välittömätkomposiittityypit. Argumentti voi olla muuttu<strong>ja</strong> tai vakio. Vakion tuleeolla jokin tietokannasta löytyvän oliotyypin nimi. Argumentti arg1 tarkoittaakomposiittityyppiä, <strong>ja</strong> arg2 sen komponenttityyppiä. Primitiivi arvottaa argumentit,jotka ovat muuttujia. Esimerkiksi tämän primitiivin ilmaisullaX is_composite_type_of pedals.X:n arvotuksena saadaan pedals-luokan komposiittiluokat. Toisin sanoen esimerkkitietokantaansoveltamalla primitiivi antaa X:lle seuraavat arvotukset:


53X = steering, X = tricycle, X = drive-gear,X = bicyclePrimitiivillä voidaan saada selville myös jonkin osan komponentit soveltamallaprimitiiviä alla olevalla tavalla. Siinä primitiivi arvottaa X:n kaikilla tietokannastalöytyvillä steering-luokan komponenteilla Ilmaisusteering is_composite_type_of X.tuottaa seuraavat arvotuksetX = front-axle, X = handlebar, X = pedals, X = wheelPrimitiiviä voidaan käyttää myös etsimään kaikki kompositio-/komponenttisuhteet,jotka tietokannassa löytyvät. Tämä saadaan aikaiseksi siten, että molemmatprimitiivin argumentit ovat muuttujia. Esimerkiksi ilmaisu:X is_composite_type_of Y.antaa suuren joukon vastauksia (eli X:n <strong>ja</strong> Y:n arvotuksia), joista vain seuraavatesitetään{X = steering, Y = front-axle}, {X = tricycle, Y = pedals} <strong>ja</strong> {X = bicycle, Y =saddle} jne…Toinen primitiivi on ensimmäisen käänteisprimitiivi. Ensimmäisellä primitiivilläpystytään ilmaisemaan samat asiat kuin toisella. Primitiivi on kuitenkin toteutettu,jotta käyttäjä voi käyttää kieltä intuitiivisemmin.Kolmas primitiivi antaa tietokannasta osa-kokonaisuussuhteen ylimmän tasontyypit. Esimerkkitietokannan tapauksessa ilmaisuX is_top_typeantaa vastaukseksiX = tricycle, X = bicycle.


54Neljäs primitiivi antaa puolestaan tietokannassa olevien osakokonaisuussuhteidenperustyypit, <strong>ja</strong> sitä käytetään argumentin osalta samaantapaan kuin is_top_type -primitiiviä.Viidennellä primitiivillä saadaan selville oliotyypin ominaisuudet. Argumentillaarg1 ilmaistaan ominaisuus, joka liittyy argumentilla arg2:lla ilmaistuunoliotyyppiin.Esimerkkitietokannasta kyselyX is_property_of wheelantaa tulokseksiX = Diam, X = Rtype <strong>ja</strong> X = W.Kuudes primitiivi antaa argumenttiin arg2 johtavan polkuesityksen argumentissaarg1. Primitiivi antaa kaikki polkuesitykset, joita tietokannasta oliotyypillelöytyy. KyselyX is_path_to wheelantaa esimerkkitietokannasta vastauksetX = t(wheel,steering,tricycle), X = t(wheel,rear,tricycle), X =t(wheel,steering, bicycle) <strong>ja</strong> X = t(wheel,bicycle).Seitsemännessä primitiivissä muuttu<strong>ja</strong> arvottuu sellaisilla oliotyyppeillä, jotkaesiintyvät kaikissa tietokannassa olevissa osa-kokonaisuussuhteissa komponentteina.Kahdeksas primitiivi on samanlainen kuin seitsemäs, mutta vastaussaadaan listaesityksenä. Primitiiviä seitsemän kannattaa käyttää tilanteissa,joissa primitiivin tulosta käsitellään kyselyssä jonkin toisen primitiivin argumenttina.Kahdeksas primitiivi on kätevä tilanteissa, joissa primitiivin tulosta eikäsitellä edelleen, sillä listaesitys on havainnollisempi.6.2.2. Intensionaalis-ekstensionaaliset primitiivitIntensionaalisen <strong>ja</strong> ekstensionaalisen tason yhdistäviä primitiivejä on kielessäkuusi. Tasojen yhdistäminen ilmaistaan siten, että primitiivin toinen argumenttikuuluu ekstensionaaliselle tasolle <strong>ja</strong> toinen intensionaaliselle tasolle. Kieli sisältääseuraavat intensionaalis-ekstensionaaliset primitiivit:


551. arg1 is_instance_of arg22. arg1 : arg23. arg1 is_composite_object_of arg24. arg1 is_component_object_of arg25. arg1 is_basic_object6. arg1 is_top_objectEnsimmäinen primitiivi ilmaisee luokan <strong>ja</strong> sitä vastaavan ilmentymän. Argumenttinaarg1 on olio (ekstensionaalinen taso), joka kuuluu oikealla puolellaolevaan luokkaan (intensionaalinen taso). Luokka ilmaistaan argumentilla arg2.Alla on kolme esimerkkiä primitiivin käytöstä.1. X is_instance_of saddle2. (tricycle|543664) is_instance_of X4. X is_instance_of Y.Ensimmäisessä esimerkissä saadaan esimerkkitietokannasta oliot, joilla on olioidentiteetito10,o15,o27,o29,o34 <strong>ja</strong> o46. Toisessa esimerkissä primitiiville annetaanProlog++ -esitystavan mukainen oliorakenne <strong>ja</strong> vastaukseksi saadaan tricycle.Tämänkaltaista kyselyä ei ole järkevää tehdä, mutta jos on kyse muuttu<strong>ja</strong>stajoka on alustettu olioksi, on tällaisesta primitiivin käyttötavasta useissakintilanteissa hyötyä. Kolmannessa esimerkissä saadaan vastaukseksi kaikki tietokannanoliot <strong>ja</strong> niitä vastaavat oliotyypit.Toinen primitiivi on tarkoitettu olion ominaisuuksien arvojen selvittämistätai tietyillä ominaisuuden arvoilla olevien olioiden etsimistä varten. Arg1 onolio <strong>ja</strong> arg2 on muotoa property(arg3) oleva termi, jossa property on sen oliotyypinominaisuus, johon olio arg1 kuluu. Arg3 voi olla joko muuttu<strong>ja</strong> tai attribuutinarvo. Alla olevat esimerkit selventävät primitiivin käyttöä:1. X:material(Y)2. X:material(aluminium)Ensimmäisessä esimerkissä primitiivin käytölle on ehtona, että muuttu<strong>ja</strong> onalustettu olioksi primitiivin käyttöhetkellä. Ensimmäinen esimerkki arvottaaY:n X-olion material-attribuutin arvolla. Jos X on arvotettu esimerkkitietokantammetricycle:n komponenttina olevalla frame-oliolla, jonka id on o14, saadaanvastaukseksi Y = steel . Toisessa esimerkissä primitiiviä käytetään antamaanrajoite. Tarkasteltavan olion täytyy siis täyttää ehto, että sen materialominaisuudenarvona on aluminium. Tällöin ehdon täyttää esimerkkitietokan-


56nan olio, jolla on oliotunnus o26. Jos oliolta kysytään ominaisuutta jota silläei ole, sulkujen sisällä oleva muuttu<strong>ja</strong> saa arvon null. Primitiiviä voi käyttäämyös siten, että ominaisuuteen viitataan muuttu<strong>ja</strong>lla, mutta esittelen tätä ominaisuuttamyöhemmin esimerkkikyselyjen yhteydessä.Kolmas primitiivi ilmaisee oliotyypin komposiittityyppien oliot. Arg1 onolio, joka kuuluu arg2:lla ilmaistuun oliotyypin komposiittityyppiin. Täten kyselyX is_composite_object_of pedalsantaa vastaukseksi esimerkkitietokannasta oliot seuraavilla oliotunnisteilla:o11,o16,o28,o12,o13,o25,o28,o33,o41,o37,o38, o39.Kolmannella primitiivillä ei voi etsiä komponenttiobjekte<strong>ja</strong>. Ne siis eivät oletoistensa käänteisprimitiivejä, vaikka intensionaalisten primitiivien kohdallais_composite_type_of <strong>ja</strong> is_component_type_of –primitiivit olivatkin. Tämä johtuusiitä, että primitiivin argumentit ovat eri tason argumentte<strong>ja</strong>. Primitiiviä voikäyttää myös siten, että arg1 on alustettu olioksi. Tällöin arg2 alustetaan arg1:stävastaavan oliotyypin komponenttityypillä. Myös molemmat argumentit voivatolla muuttujia. Tällöin primitiivi hakee tietokannasta kaikki oliot <strong>ja</strong> niitä vastaavienoliotyyppien komponenttityypit.Neljättä primitiiviä käytetään samaan tapaan kuin 3. primitiiviä, mutta seetsii annetun oliotyypin komponenttioliot.Viides <strong>ja</strong> kuudes primitiivi etsivät tietokannan osa-kokonaisuussuhteidenylimmän tason oliot <strong>ja</strong> perusoliot vastaavassa järjestyksessä. Niitä käytetäänsaman tapaan kuin intensionaalisia vastinprimitiivejäänkin, mutta ne palauttavatoliot tyyppien si<strong>ja</strong>an.6.2.3. Kyselyn tuloksen esittämisprimitiivit1. arg1 Where arg22. Min()3. Max()4. Count()5. Avg()Tämä ryhmä koostuu primitiiveistä, joilla voidaan vaikuttaa kyselyn tuloksenmuotoon <strong>ja</strong> tuottaa erilaisia aggregointitieto<strong>ja</strong> kyselyjen vastauksiin. Aggre-


57gointitiedotilmaistaan aggregointioperaatioilla, joita ovat ylläolevassa luettelossa operaatiot 2-5. Nämä operaatiot on lainattu deduktiivisilleoliotietokannoille suunnitellusta Prolog++ -poh<strong>ja</strong>isesta ky<strong>selykielen</strong> prototyypistä[Christensen, 1998]. Tämä siksi, että ne sopivat lähes sellaisinaan tutkielmanky<strong>selykielen</strong> tarpeisiin.Where-primitiivi (alkuperäiseltä nimeltään provided) on kyselyn muodostamisenkannalta keskeinen. Primitiivin argumentilla arg1 käyttäjä ilmaisee tulosrelaationmuodon, johon hän poimii haluamansa muuttu<strong>ja</strong>t oikealla puolellaolevasta kyselyilmauksesta. Where-primitiivi muistuttaa relaatioalgebran valintaoperaatiota,jolla halutut relaation attribuutit valitaan tulosjoukkoon. Whereprimitiivinsoveltamisella valitaan kuitenkin relaation attribuuttien si<strong>ja</strong>sta kyselyssämukana olevia muuttujia. Tällöin voidaan jättää vastauksesta kyselyssäilmenevät, mutta loppukäyttäjän näkökulmasta merkityksettömät muuttu<strong>ja</strong>tpois. Where-primitiivillä on kuitenkin monipuolisemmat käyttömahdollisuudet,mitä relaatioalgebran valinta-operaattorilla. Where –primitiivin vasemmallepuolelle tuleva tulos ilmaistaan tuple-rakenteina. Käyttäjä voi itse valita tuloksessakäytettävän tuplen nimen. Jos tuplen muuttu<strong>ja</strong>t on arvotettu olioiksi olioita,niihin voi soveltaa : -primitiiviä, jolla olion tietyn attribuutin arvo saadaantulokseen. Primitiivin käyttötapa tulosjoukon yhteydessä eroaa kuitenkin edelläesitetystä. Relaatiossa ei nimittäin käytetä sulku<strong>ja</strong> ominaisuuden nimen jälkeen.Pelkkä ominaisuuden nimi siis riittää tulosjoukon yhteydessä. Jos tuloksessailmaistaan : -primitiivi oliolle, jolla ei ole kyseistä ominaisuutta, niin vastaukseksitähän kohtaan tuple-rakenteessa saadaan arvo null.Where-primitiivin arg1:ssä ilmaistut tuplen alkioina olevat muuttu<strong>ja</strong>t arvottuvatjoillakin arvoilla. Vastaus ilmaistaan relaationa <strong>ja</strong> relaation tuplet tulostetaanomille riveilleen allekkain. Primitiivi poistaa kaikki samat tuplet, relaatiomallintapaan. Esimerkiksi kyselytulos(X) where X is_component_type_of steeringtulostaa vastaukseksi esimerkkitietokannasta seuraavat yksipaikkaiset tulostuplet.Toisin sanoen muuttu<strong>ja</strong> X on arvottunut where-primitiivin oikealla puolellaolevan kyselyilmauksen mukaisesti.tulos(front_axle)tulos(handlebars)tulos(pedals)tulos(wheel)


58Seuraavassa kyselyssä käytetään : - primitiiviä tulosrelaation muodonmäärittelyssä. Kysely antaa tulokseksi kaikki ylimmän tason olioiden tyypit <strong>ja</strong>näiden tyyppien ilmentymiä vastaavat price-attribuutin arvot:tulos(X,Y:price) where X is_top_type,Y is_instance_of XKysely antaa vastaukseksi esimerkkitietokantaan liittyen seuraavan relaation:tulos(tricycle,100)tulos(tricycle,250)tulos(tricycle,400)tulos(bicycle,500)tulos(bicycle,400)Sama tulos oltaisiin saatu myös kyselyllätulos(X,Y) where X is_top_type,Z is_instance_of X,Z:price(Y).Aikaisempi kysely oli kuitenkin yksinkertaisempi: vastaukseen on helppo poimiajokin muuttu<strong>ja</strong>, joka tarkoittaa oliota <strong>ja</strong> viitata sitten sen ominaisuuden arvoon.Tulosrelaation määrittelyssä voidaan viitata sekä tavalliseen, että johdettuunattribuuttiin. Jos sen si<strong>ja</strong>an olioille asetetaan rajoituksia attribuuttien arvojenperusteella, joudutaan käyttämään ominaisuuden arvon ilmaisemista jälkimmäisellätavalla.Aggregointifunktiolla suoritetaan erilaisia tietokannassa oleviin tietoihinkohdistuvia laskutoimituksia. Aggregointioperaatioita ovat lukumäärä count,keskiarvo avg sekä maksimi- max <strong>ja</strong> minimiarvon min(). Tulosrelaation kuvauksessailmaistaan aggregointioperaatioiden argumenttina se kohde, josta aggregointitieto<strong>ja</strong>halutaan laskea. Kyselytulos(count(X)) where X is_top_object.tulostaa vastaukseksitulos(6)Kyselyn tuloksena saatiin esimerkkitietokannassa olevien osakokonaisuussuhteidenylimpien tasojen olioiden kokonaislukumäärä. Vaikka


59täsmälleen samat rivit poistetaankin tulosrelaatiosta, aggregoinnissa neotetaan huomioon, jotta saadaan oikea tulos.Kyselyssä ei ole rajoitetta aggregointifunktioiden ilmaisemisen määrää.Seuraavassa kyselyssä halutaan osa-kokonaisuussuhteiden ylimmän tason olioidenlukumäärä, minimipaino, maksimipaino <strong>ja</strong> keskimääräinen paino.tulos(count(X),min(Y:weigth),max(Y:weigth),avg(Y:weigth)) where Xis_top_type,Y is_instance_of X.Tuloksena saadaantulos(6,10.1,17,14.3333333333333).Pilkut erottavat tuloksen argumentit toisistaan <strong>ja</strong> desimaale<strong>ja</strong> merkitään pisteillä.6.2.4. Muut primitiivit <strong>ja</strong> komennotTähän ryhmään kuuluvat primitiivit, jotka eivät kuulu mihinkään edellä esitettyynryhmään. Ensimmäinen primitiivi on varsinainen kyselyprimitiivi, muuttietokantasovelluksen käsittelyyn liittyviä primitiivejä.1. Apply_to arg12. start3. add4. quitApply_to-primitiivi rajoittaa kyselyssä tarkasteltavia osa-kokonaisuussuhteita.Kyselyissä oletusarvona on se, että kysely kohdistuu kaikkiin osakokonaisuussuhteisiin.Arg1 sisältää listaesityksenä niiden ylimpien tyyppiennimet, joihin kyselyssä ilmaistujen primitiivien halutaan kohdistuvan. Jos käyttäjähaluaa esimerkkitietokannan tapauksessa sekä tricycle:n-, että bicycle:n osakokonaisuudetmukaan kyselyihinsä, hän käyttää seuraavaa ilmaisua:apply_to [tricycle,bicycle].Apply_to –primitiivin vaikutus on voimassa vain kyselyn a<strong>ja</strong>n <strong>ja</strong> seuraavassakyselyssä on taas kaikki osa-kokonaisuussuhteet mukana.


60Start-komento käynnistää kyselytilan, jonka jälkeen kyselyitä voisuorittaa. Quit-komento siirtyy puolestaan pois kyselytilasta. Add-komennollavoidaan luoda uusia olioita tiedostoon. Tämä helpottaa olioiden luomista, silläkompleksisen rakenteen omaavia olioita luotaessa täytyy asettaa monta arvoa.Olioiden luonnissa tarvittavat arvot voidaan kirjoittaa vain kerran tiedostoon.Kun add-komento suoritetaan, ohjelma pyytää käyttäjää kirjoittamaan tiedostonnimen, jossa olion luontikomennot si<strong>ja</strong>itsevat.6.3. EsimerkkikyselytOlen <strong>ja</strong>otellut esimerkkikyselyt samalla tavalla kuin kappaleessa neljä. Annantoisin sanoen esimerkkikyselyjä intensionaalisista-, ekstensionaalisista- sekäintensionaalis-ekstensionaalisista kyselyistä. Jokaisen kyselytyypin kohdallaesitän myös kyselytyyppiä vastaavia yhdistettyjä kyselyjä.6.3.1. Intensionaaliset esimerkkikyselytEnsimmäisellä tämän kategorian esimerkkikyselyllä haetaan tricycle:n peruskomponenttityypitseuraavasti:result(X) where apply_to[tricycle], X is_basic_type.Kyselyn alussa määritellään, että ollaan kiinnostuneita ainoastaan tricycle:n osakokonaisuussuhteesta.Vastaus saadaan kyselyn muuttu<strong>ja</strong>n X arvotuksista.Vastaukseksi saadaan tuloksetresult(frame)result(saddle)result(front_axle)result(handlebar)result(pedals)result(rear_axle)result(wheel).Jos kyselyn haluttaisiin kohdistuvan koko esimerkkitietokantaan, olisi kyselystäpitänyt jättää apply_to –primitiivi pois. Jos kyselyn kohdassa result(X) olisi sovellettucount() –aggregointiprimitiiviä, oltaisiin saatu selville kuinka montaperuskomponenttityyppiä tricycle:llä on.Seuraavalla kyselyllä haetaan kaikkien niiden oliotyyppien polut, joilla onominaisuutena diam.


61res(X) where diam is_property_of Y,X is_path_to Y.Kyselyssä määritellään ensin, että muuttu<strong>ja</strong>n Y tulee olla oliotyyppi, jolla onominaisuus diam. Tämän jälkeen ilmaistaan, että X on Y:hyn johtava polku. Vastauksenasaadaan siis tuple-muotoiset polkuesitykset poluista, jotka johtavatoliotyyppeihini rear_axle, chainring, pedals <strong>ja</strong> wheel. Jos tietyllä tyypillä on useampipolkuvaihtoehto, kaikki vaihtoehdot saadaan vastaukseksi. Ylläolevaankyselyyn tuotetaan seuraava vastaus esimerkkitietokannan yhteydessä.res(t(tricycle,rear,rear_axle))res(t(bicycle,drivegear,chainring))res(t(tricycle,steering,pedals))res(t(bicycle,drivegear,pedals))res(t(tricycle,steering,wheel))res(t(tricycle,rear,wheel))res(t(bicycle,wheel))res(t(bicycle,steering,wheel))Tricycle:n oh<strong>ja</strong>uksen komponenttien nimet <strong>ja</strong> niiden ominaisuuksien nimet saadaanselville seuraavalla kyselyllä:res(X,Y) where apply_to [tricycle],X is_component_type_of steering, Yis_property_of X.Ensin ilmaistaan, että tarkastelu rajoitetaan vain tricycle:n osakokonaisuussuhteeseen.Tämän jälkeen ilmaistaan, että X-muuttu<strong>ja</strong> alustetaanoh<strong>ja</strong>uksen komponentilla <strong>ja</strong> että Y-muuttu<strong>ja</strong> on X-muuttu<strong>ja</strong>n sisältämän komponentinominaisuus. Tulosrelaatio koostuu X- <strong>ja</strong> Y-muuttujien seuraavista arvoista.res(front_axle,l)res(front_axle,weigth)res(handlebar,b)res(handlebar,weigth)res(pedals,diam)res(pedals,weigth)res(wheel,diam)res(wheel,r_type)


62res(wheel,weigth)Seuraavaksi esitän yhdistetyn kyselyn, jossa intensionaalisen vastauksen antavankyselyn sisällä ilmaistaan ekstensionaalinen alikysely. Kyselyssä halutaansaada vastaukseksi intensionaalista tietoa käyttämällä ekstensionaalista kriteeriä.Kyselyssä etsitään kaikki ne tricycle:n <strong>ja</strong> bicycle:n yhteiset komponenttityypit,joiden ekstensionaaliselta tasolta löytyy ainakin yksi olio, jonka materialattribuutinarvo on steel.res(X) where common_component X, Y is_instance_of X, Y:material(steel).Kyselyssä siis ilmaistaan, että X on yhteinen komponentti kaikille tietokannassaoleville osa-kokonaisuussuhteille. Esimerkkitietokannassa ei ole muita osakokonaisuussuhteitakuin tricycle <strong>ja</strong> bicycle. Tämän takia apply_to –primitiivinkäyttö ei ole välttämätöntä, koska oletuksena kyselyyn otetaan kaikki osakokonaisuussuhteet.Muuttu<strong>ja</strong> Y ilmaisee kyselyssä yhteisen komponentin mitätahansa ilmentymää. Lopuksi kyselyssä rajoitetaan Y –muuttu<strong>ja</strong>n sisältämiäolioita siten, että olion material-attribuutin arvona täytyy olla steel. Kyselyn tulokseenhalutaan saada vain X-muuttu<strong>ja</strong>n arvot. Tuloksia saadaan esimerkkitietokannanyhteydessä vain yksi:res(frame)Seuraava intensionaalinen kysely on myös yhdistetty kysely. Siinä etsitäänkaikki ne tricycle:n komponenttityypit, joilla on ainakin yksi ilmentymä, jonkadiam-attribuutin arvona on joko 4 tai 5.res(Y) where X is_component_object_of tricycle, (X:diam(4);X:diam(5)), Xis_instance_of Y.Kyselyssä ilmaistaan, että X-muuttu<strong>ja</strong>n tulee olla kolmipyörätyypin komponenttiolio,jonka diam-attribuutin arvon täytyy olla joko 4 tai 5. Lisäksi ilmaistaan,että muuttu<strong>ja</strong> Y on X-komponenttia vastaava oliotyyppi. Vastaukseenpoimitaan ainoastaan Y-muuttu<strong>ja</strong>n arvotuksia. Vastaukseksi esimerkkitietokannassasaadaan kaksi oliotyyppiä:res(pedals)res(wheel)


636.3.2. Ekstensionaaliset kyselytEkstensionaalisilla kyselyillä tarkoitetaan kaikkia sellaisia kyselyjä, jotka antavatainoastaan ekstensionaalista tietoa vastauksenaan. Tämän vuoksi olioitavastauksena antavat kyselyt kuuluvat myös tähän kyselyryhmään. Käyttäjä eiole tavallisesti kiinnostunut olioidentiteeteistä. Olioidentiteetit ovat ainoastaanyksilöinnin välineenä olio-orientoituneessa toteutuksessa. Tämän vuoksi olioitavastauksenaan antavia kyselyjä ei käsitellä, vaikka sellaisten kyselyiden ilmaiseminenkielellä onkin mahdollista.Seuraava kysely antaa tricycle:n <strong>ja</strong> bicycle:n komponentteina olevien polkimiendiam-attribuutin arvot:res(X:diam) where (X is_component_object_of bicycle; Xis_component_object_of tricycle), X is_instance_of pedals.Kyselyssä ilmaistaan, että muuttu<strong>ja</strong>n X tulee olla joko bicycle:n tai tricycle:n alikomponenttiolio<strong>ja</strong> lisäksi olion tulee kuulua pedals-luokkaan. Vaikka bicycle:ssäpedals-komponentti si<strong>ja</strong>itsee drive gear-komponentin komponenttina <strong>ja</strong> tricycle:ssäpuolestaan steering-komponentin komponenttina, vastaus sisältää molemmattapaukset. Tämäntapainen kysely ei olisi ollut mahdollista iteraatioonperustuvan kielen avulla, koska navigointipolku pedals-komponenttiin on erilainentricycle:llä <strong>ja</strong> bicycle:llä. Vastaukseksi kyselylle esimerkkitietokannastasaadaan seuraava yksipaikkainen relaatio:res(5)res(6)res(7)res(8)res(10)Seuraavassa kyselyssä ollaan kiinnostuneita vain tiedosta, mitä materialattribuutineri arvo<strong>ja</strong> on tricycle-luokan ilmentymien komponenteilla olemassa.Kysely edustaa tilannetta, jossa ei ole merkitystä tiedolla, minkä tyyppisessäkomponentissa kukin arvo si<strong>ja</strong>itsee. Kysely voidaan muodostaa seuraavallailmauksella:res(X:material) where X is_component_object_of tricycle.


64Käyttäjän ei tarvitse välittää siitä, onko komponentilla material-nimistä attribuuttia.res(steel)res(aluminium)Seuraavassa kyselyssä ilmaistaan tricycle:n ilmentymien määrän <strong>ja</strong> niiden painonkeskiarvon antava kysely:res(avg(X:weigth),count(X)) where X is_instance_of tricycle.Kyselyn lopputuloksessa halutaan saada johdetun attribuutin keskiarvo, elikyselyn aikana suoritetaan ensin komponenttien painojen yhteenlasku kolmipyöränweigth-metodin avulla <strong>ja</strong> tämän jälkeen lasketaan näistä tuloksista vieläkeskiarvo. Samalla voidaan kysyä, kuinka monta tricycle:ä tietokannassa on.Vastaus ilmaisee, että kannan kolmipyörien keskiarvo on 7.1 <strong>ja</strong> että keskiarvolaskettiin kolmesta tricycle-oliosta. Toisin sanoen kysely antaa seuraavan vastauksen:res(7.1,3)Seuraava esimerkki esittelee yhdistetyn kyselyn, joka antaa ekstensionaalisenvastauksen. Siinä halutaan saada selville sellaisen bicycle:n frame- komponentinmateriaali, jonka frame:n sar<strong>ja</strong>numero on 5435534. Tässä kyselyssä käyttäjän eitarvitse tietää, minkä niminen attribuutti frame:n sar<strong>ja</strong>numeroon liitetään. Kyselyssäres(Y:material) where Y is_component_object_of tricycle, P is_property_offrame,Y:P(5435534).käyttäjä ilmaisee, että Y tarkoittaa oliota, joka on tricycle:n alikomponenttina.Lisäksi hän ilmaisee, että P tarkoittaa frame:n ominaisuutta <strong>ja</strong> rajoittaa Y olionkoskemaan vain oliota, jonka ominaisuuden arvona on 5435534. Kieli mahdollistaasiis erittäin käyttäjäystävällisen tavan viitata ominaisuuksiin. Riittää, ettäkäyttäjä tietää ominaisuuden arvon. Hän voi tällöin kyselyssä viitata oliotyypinominaisuuteen muuttu<strong>ja</strong>lla. Vastaukseksi yllä olevaan kyselyyn saadaan


65res(aluminium).Jos käyttäjä ei ole varma, viittaako arvo 5435534 oikean nimiseen attribuuttiin,hän voi tarkistaa sen muuttamalla yllä olevan kyselyn vastauksen muodostamisilmaisuaseuraavalla tavalla: res(Y:material,P). Tällöin vastauksesta olisi selvinnyt,mihin attribuuttiin arvo liittyy. Tällainen kysely olisi ollut intensionaalis-ekstensionaalinenkysely, koska vastauksessa olisi ollut molempien tasojentietoa.Viimeinen ekstensionaalinen esimerkkikysely on myös yhdistetty kysely. Siinäkyselyllä analysoidaan, kuinka paljon kaikki bicycle:jen teräksiset komponentitpainavat yhteensä.res(sum(Comp:weigth)) where material is_property_of C, Compis_instance_of C,Comp is_component_object_of bicycle, Comp:material(steel).Kyselyssä ilmaistaan, että Comp-muuttu<strong>ja</strong>n tulee olla olio, jolla on material –niminen attribuutti <strong>ja</strong> jonka arvona on steel. Lisäksi komponentin tulee olla bicycle:nkomponenttina. Kyselyn vastaus onres(9).6.3.3. Intensionaalis-ekstensionaaliset kyselytTämä kyselytyyppi sisältää ky<strong>selykielen</strong> monipuolisimmat kyselyt. Vastauksenasaadaan kummankin abstraktiotason tieto<strong>ja</strong>, <strong>ja</strong> lisäksi tämäkin kyselytyyppisisältää monia mielekkäitä yhdistettyjä kyselyjä. Kyselytyypin vastaukset ovatmonissa tilanteissa havainnollisempia kuin edellä esitetyt kyselytyypit. Tämäjohtuu siitä, että arvo<strong>ja</strong> voidaan havainnollistaa arvoa vastaavalla intensionaalisellatasolla. Primitiivien esittelyn yhteydessä muodostinkin jo yksinkertaisenintensionaalis-ekstensionaalisen kyselyn. Siinä hain osa-kokonaisuussuhteenylimmän tason oliotyypit <strong>ja</strong> tyyppejä vastaavien olioiden price-attribuutin arvo.Kysely on siitä kätevä, että käyttäjän ei tarvitse tehdä kyselyä jokaiselle ylimmäntason oliotyypille erikseen. Lisäksi vastauksesta on helppo vertailla erityyppien hinto<strong>ja</strong>. Eri tyyppisten polkupyörien keskihinta olisi ollut helpostiilmaistavissa soveltamalla kyselyn vastaukseen avg –aggregointifunktiota.Seuraavalla kyselyllä haetaan kaikkien tricycle:n komponenttien nimet <strong>ja</strong>näitä komponentte<strong>ja</strong> vastaava keskimääräinen paino:res(I,avg(X:weigth)) where X is_component_object_of tricycle, Xis_instance_of I.


66Kyselyssä ilmaistaan, että muuttu<strong>ja</strong> X on tricycle:n komponenttiolio <strong>ja</strong> muuttu<strong>ja</strong>I on X-muuttu<strong>ja</strong>a vastaava tyyppi. Tulosrelaatio muotoillaan siten, että ensimmäisenärelaation attribuuttina on oliotyyppi. Sitä seuraa tyypin ilmentymienkeskipaino. Tämänkaltaisilla kyselyillä voidaan luoda kokonaisvaltainen katsaustricycle:jen komponenttien painon <strong>ja</strong>kautumiseen eri osien kesken. Vastaukseksikyselyyn saadaan relaatiores(frame,3)res (saddle,0.4)res (steering,2.12)res (rear,2.38)res(front_axle,0.92)res (handlebars,0.9)res (pedals,0.34)res (rear_axle,1.14)res (wheel,1.29333333333333).Laajennan seuraavaksi aikaisemmin esitettyä ekstensionaalista kyselyä, jossaoltiin kiinnostuneita siitä, mitä eri materiaale<strong>ja</strong> tricycle:n komponenteilla onolemassa. Tällä kertaa kysely kohdistetaan käsittelemään bicycle:ä. Materiaalivaihtoehtojenlisäksi seuraavalla kyselyllä saadaan selville, mihin komponenttiinmateriaali liittyy. Kyselynres(I, X:material) where apply_to [bicycle],X is_component_object_of bicycle,Xis_instance_of I,material is_property_of I.vastaukseksi saadaan relaatiores(frame,steel)res(saddle,leather)res(saddle,plastic).Laajennan edellistä kyselyä entisestään. Nyt ilmaistaan kysely, jossa <strong>ja</strong>otellaankomponentit materiaalin perusteella <strong>ja</strong> lasketaan <strong>ja</strong>ottelun mukaisten komponenttienyhteispaino esimerkkitietokannasta.


67res(C,Material,sum(Comp:weigth)) where apply_to [bicycle], materialis_property_of C, Comp is_instance_of C,Comp is_component_object_of bicycle,Comp:material(Material).Kyselyssä where-primitiivin oikealla puolella ilmaistaan, että kyselyä sovelletaanainoastaan bicycle:n osa-kokonaisuussuhteille apply_to-primitiivin avulla.C-muuttu<strong>ja</strong>lla tarkoitetaan komponenttityyppiä, jolla on attribuutti nimeltäänmaterial. Lisäksi ilmaistaan, että Comp-muuttu<strong>ja</strong> tarkoittaa C-muuttu<strong>ja</strong>n mukaistailmentymää <strong>ja</strong> että ilmentymän tulee olla bicycle:n alikomponenttioliona. LopuksiComp-muuttu<strong>ja</strong>n arvona olevan olion material-attribuutin arvoon viitataanMaterial-muuttu<strong>ja</strong>lla. Vastausrelaatioon halutaan mukaan komponenttityyppi,tyyppiä vastaava materiaali <strong>ja</strong> komponentti-materiaali -paria vastaavienkomponenttien yhteenlaskettu paino. Komponenttityypin tieto löytyy siis C-muuttu<strong>ja</strong>sta <strong>ja</strong> tyyppiin liittyvä materiaali Material-muuttu<strong>ja</strong>sta. Soveltamallasum –aggregointifunktiota, yksittäisen komponenttiolion painoon, saadaankaikkien ehdot täyttävien komponenttien painojen summa selville.Kyselyn vastauksena saadaan relaatiores(frame,steel,10.2)res(saddle,leather,1.1)res(saddle,plastic,2.2).Analyyttistä voimaa sisältyy myös kyselyyn, jossa saadaan vastaukseksi polkupyöräntietyn osan kaikki komponentit, niiden ominaisuudet <strong>ja</strong> ominaisuuksienarvot. Tällöin saadaan kerralla kattava näkemys tietyn komponentin intensionaalisesta<strong>ja</strong> ekstensionaalisesta tasosta. Seuraavassa esimerkkikyselyssä halutaansaada selville tricycle:n steering:in kaikki alikomponentit <strong>ja</strong> niitä vastaavatominaisuudet. Lisäksi jokaisen ominaisuuden kohdalla halutaan vielä ominaisuudenarvo. Kyselyres(T,P,Z) where apply_to [tricycle], X is_component_object_of steering,Xis_instance_of T,P is_property_of T,X:P(Z).tuottaa laa<strong>ja</strong>n relaation, jonka tupleista esittelen vain muutaman:result(front_axle,l,4)result(front_axle,weigth,14)result(handlebars,weigth,1.1)


68result(handlebars,b,13)result(pedals,weigth,3)result(pedals,diam,5)result(wheel,weigth,1.4)result(wheel,diam,8)result(wheel,r_type,united)


697. YhteenvetoTutkielmassa tarkastelin osa-kokonaisuussuhteen käsittelyyn soveltuvan ky<strong>selykielen</strong><strong>suunnittelu</strong>a <strong>ja</strong> sen <strong>toteutus</strong>ta. Toteutin kielen Timo Niemen <strong>ja</strong> MarkoJunkkarin <strong>suunnittelu</strong>n poh<strong>ja</strong>lta. Kielen ilmaisuissa ei tarvitse hallita olio- taideduktiivisten tietokantojen yhteydessä käytettyjä, tavalliselle loppukäyttäjällehankalia käsitteitä. Näitä ovat esimerkiksi rekursio, mallinsovitus <strong>ja</strong> iterointi.Tällöin loppukäyttäjän ei tarvitse omata ohjelmointitaito<strong>ja</strong>. Kielen avulla hänenei myöskään tarvitse navigoida osa-kokonaisuussuhteissa. Kielen käyttäjän eimyöskään tarvitse hallita nest- <strong>ja</strong> unnest-operaatioiden tapaisia osakokonaisuushierarkianuudelleenstrukturointe<strong>ja</strong>. Sen si<strong>ja</strong>an kielen primitiivittukevat haluttujen komponenttien <strong>ja</strong> komposiittien välillä vallitsevien suhteidenmonipuolista ilmaisemista. Nämä primitiivit hoitavat niin välillisten kuinvälittömienkin komponenttien <strong>ja</strong> komposiittien käsittelyt. Tämän johdosta käyttäjänmuistamistaakka kaaviotasosta vähenee <strong>ja</strong> osien <strong>ja</strong> kokonaisuuksien välilläkulkeminen helpottuu.Johdetut attribuutit on toteutettu siten, että käyttäjän ei tarvitse tietää, kuinkaarvo muodostuu. Kielessä johdettu<strong>ja</strong> <strong>ja</strong> tavallisia attribuutte<strong>ja</strong> käytetään samallatavalla. Kielen deklaratiivisuuden aste on korkea. Kyselyt suoritetaankuvailemalla primitiivien avulla yhteyksiä muuttujien välillä. Käyttäjän tuleeymmärtää vain <strong>ja</strong>etun muuttu<strong>ja</strong>n, disjunktion, konjunktion, sulkujen <strong>ja</strong> primitiivienmerkitys. Tämän lisäksi käyttäjän tulee omata käsitys intensionaalisesta<strong>ja</strong> ekstensionaalisesta tasosta.Kyselyillä voidaan tuottaa intensionaalista, ekstensionaalista tai intensionaalis-ekstensionaalistatietoa. Pelkästään ekstensionaaliset vastaukset riittävättietyissä tilanteissa. Intensionaalisilla vastauksilla voidaan puolestaan saadatietoa käyttäjälle vieraista rakenteista. Kysely voidaan tämän johdosta suorittaa,vaikka osa-kokonaisuushierarkia luokkien nimineen <strong>ja</strong> attribuutteineen ei olisikaantäysin selvillä. Lisäksi intensionaaliset kyselyt voivat havainnollistaa ekstensionaalisentason tieto<strong>ja</strong> [Motro, 1994]. Jos esimerkiksi halutaan kyselylläselvittää, mitkä komponentit voivat olla materiaaliltaan muovia, saadaan vastaukseksiintensionaalista tietoa. Tieto on tällöin kuitenkin ekstensionaalisenkriteerin mukaan tuotettu. Tämä on monesti paljon havainnollisempi <strong>ja</strong> tarkoitustaanparemmin palveleva vastaus kuin puhdas ekstensionaalinen tieto. Intensionaalis-ekstensionaalisillakyselyillä mahdollistetaan kyselyt, joissa vasta-


70ukseksi saadaan molemman tason tietoa. Tämä kyselytyyppi on myösyleinen olemassaolevilla kyselykielillä.Kielen poh<strong>ja</strong>lla oleva mallinnustapa sitoo intensionaalisen <strong>ja</strong> ekstensionaalisentason tavalla, joka mahdollistaa kaksisuuntaisen liikkumisen tasojen välillä.Tasojen sitomiseen <strong>ja</strong> osa-kokonaisuussuhteen analysointiin käytin indeksointimekanismia[Niemi, 1983; Junkkari, 2001]. Mallinnuksen toteutin Prolog++ohjelmointikielellä [Moss, 1994], joka on deduktiivinen olio-orientoitunut kieli.Junkkarin [2001] kehittämä PSE-esitystavan mallinsin Prolog-termeillä konstruktointiprimitiivienavulla [Niemi and Järvelin, 1991].Prototyypin kohdalla en kiinnittänyt suurta huomiota tehokkuusnäkökulmaan.Tietyt monimutkaiset kyselyt vievätkin aikaa. Jatkokehittelyn kannaltatähän asiaan tuleekin kiinnittää huomiota. Prototyyppi osoittaa kuitenkinmahdollisuuden kehittää kieli, joka on sekä erittäin deklaratiivinen että samallailmaisuvoimainen.Totesin tutkielman teon edetessä, että myös kahdelle ekstensionaalisekstensionaaliselleprimitiiville löytyy kielessä käyttöä. Intensionaalisekstensionaalisillaprimitiiveillä ei pysty riittävän tehokkaasti sitomaan ilmentymiätoisiinsa tietyissä kyselytarpeissa. Ilman ekstensionaalis-ekstensionaalistaprimitiiviä ei pysty hakemaan tietyn olion komposiitti- tai komponenttioliota.Tällaiseen tilanteeseen on tarvetta esimerkiksi seuraavassa kyselyssä, joka liittyyedellä esitettyyn esimerkkitietokantaan: ”Anna sellaisen bicycle:n priceattribuutinarvo, jonka frame-komponentin frame no-attribuutin arvo on 8265”.Tällaisessa kyselyssä tarvitaan primitiiviä, jolla pystytään löytämään tietyn olionkomposiittiolio tai vaihtoehtoisesti tietyn olion komponenttiolio. Esitystapamahdollistaa helposti ekstensionaalis-ekstensionaalisten primitiivien toteuttamisen<strong>ja</strong> tulevaisuudessa toteutetaankin tarvittavat kaksi primitiiviä.Jatkossa kieli on tarkoitus integroida is-a suhteen monipuoliseen käsittelyynsoveltuvan kielen [Christensen, 1998; Niemi et al., 2000] kanssa. Integroinninmyötä mahdollistuvat osa-kokonaisuussuhteiden hyväksikäyttö myös deduktiivistenoliotyyppien määrittelyssä. Deduktiivisten oliotyyppien ideana on ryhmitelläolioita siten, että kriteerit täyttävät oliot edustavat ilmeistä reaalimaailmankäsitettä. Esimerkkinä deduktiivisesta oliotyypistä, joka määritellään osakokonaisuussuhteenpoh<strong>ja</strong>lta, voisi olla lasten polkupyörä. Kriteereinä tällaisellepolkupyörälle voisi olla se, että pyörä on joko kolmipyörä tai sen rungonkorkeus on enintään 50 senttiä. Deduktiivista oliotyyppiä voidaan käyttää samallatavalla kyselyissä kuin normaalia oliotyyppiä. Tavoitteena on, että loppukäyttäjänei siis tarvitse tietää, onko kyseessä deduktiivinen oliotyyppi vainormaali oliotyyppi.


718. Lähdeluettelo[Agrawal, 1987] Rakesh Agrawal, Alpha: An extension of relational algebra toexpress a class of recursive queries. In: Proc.of the 3rd IEEE Conference onData Engineering, 580-590.[Artale et al., 1996] Alessandro Artale, Enrico Franconi and Nicola Guarino,Part-whole relations in object-centered systems: an overview. Data &Knowledge Engineering. 20 (1996), 347-383.[Beraha and Su, 1999] Sabina Beraha and Jianwen Su, Support for modelingrelationship in object-oriented databases. Data & Knowledge Engineering. 29(1999), 227-257.[Belford and Santone, 1989] G.G.Belford and A.L. Santone, Object-oriented databasefor construction data. In: Proc. of the 22 ndHawaii International Conferenceon System Sciences. (1989), 559-567.[Christensen, 1998] Maria Christensen, Deduktiivisen oliotietokannan toteuttaminen<strong>ja</strong> siihen perustuvan ky<strong>selykielen</strong> kehittäminen loppukäyttäjälle.Tampereen yliopisto,tietojenkäistteluyopin laitos,pro gradu tutkielma,lokakuu1998.[Civello, 1993] Franco Civello, Roles for composite objects in object-orientedanalysis and design. In: Proc. of OOPSLA'93, ACM. (1993) 376-393.[Cluet, 1998] Sophie Cluet, Designing OQL: Allowing objects to be queried. InformationSystems 23,5 (1998), 279-305.[Carey et al., 1988] Michael J. Carey, David J. DeWitt and Scott Mohoric L.Vanderberg, A data model and query language for EXODUS In: ACMSIGMOD International Conference on Management of Data 17, 5 (Sep. 1988),413-423.[Cattell et al., 2000] R.G.G Cattell, Douglas Barry, Mark Berler, Jeff Eastman,David Jordan, Craig Russell, Olaf Schadow, Torsten Stanienda and FernandoVelez, The Object Data Standard: ODMG 3.0, Morgan Kaufmann,2000.[Deux et al., 1990] O. Deux and workgroup, The story of O 2. IEEE Transactionson Knowledge and Data Engineering. 2, 1 (1990), 109-124.[Gerstl and Pribbenow, 1995] Peter Gerstl and Simone Pribbenow. Midwinters,end games, and bodyparts: A classification of part-whole relations. InternationalJournal of Human-Computer Studies, 43 (1995), 865-889.[Goldstein et al., 1999] Robert C. Goldstein, Veda C. Storey, Data abstractions:Why and how? Data & Knowledge Engineering. 29 (1999), 293-311.


72[Halper et al., 1998] Michael Halper, James Geller, Yehosua Perl, An OODBPart-Whole model: Semantics, notation and implementation. Data &Knowledge Engineering. 27 (1998), 59-95.[Hanh et al., 1999] Udo Hahn, Stefan Schulz, Martin Romacker. Part-WholeReasoning: A Case Study in Medical Ontology Engineering. IEEE IntelligentSystems. 14, 5 (1999) 59-67.[Iris et al., 1988] M. Iris, B. Lutowitz and M. Evens. Problems with the partwholerelation. In: M. Evens editor, Relational models of the lexicon, (1988)261-288.[Junkkari, 2001] Marko Junkkari, The systematic object-oriented representationfor managing intensional and extensional aspects in modeling of part-ofrelationships. University of Tampere, Dept. of Computer and InformationSciences, Report A-2001-5, June 2001.[Järvelin and Niemi, 1999] Kalervo Järvelin and Timo Niemi, Integration ofcomplex objects and transitive relationships for information retrieval. Informationprocessing and management. 35, 5 (1999), 655-678.[Kim et al., 1987a] W.Kim, N.Ballou, J,Banerjee, H-T.Chou, J.F.Garza, andD.Woelk, Features of the ORION object-oriented database system In: Proc.of the 13 th international VLDB Conference. 319-329.[Kim et al., 1987b] Won Kim, Jay Banerjee, Hong-Tai Chou, Jorge F. Garza andDarrell Woelk, Composite object support in an object-oriented databasesystem. In: Proc. of 2 nd Conference on Object-Oriented Programming Systems,Languages, and Applications. 118-125.[Korth and Roth, 1987] Henry F. Korth, Mark A. Roth, Query language fornested relational databases. In: Proc. of Workshop on Theory and Applicationsof Nested Relations and Complex Objects, Lecture Notes in Computer Science361 (1987), Springer-Verlag, 190-204.[Koskimies, 2000] Kai Koskimies. Oliokir<strong>ja</strong>, satku.fi, 2000.[Lambrix, 2000] Patrick Lambrix, Part-Whole Reasoning in an Object-CenteredFramework. Lecture Notes in Artificial Intelligence 1771 Springer, 2000.[Lambrix and Padgham, 2000] Patrick Lambrix and Lin Padgham, Conceptualmodeling in a document management environment using part-of reasoningin description logics. Data & Knowledge Engineering 32 (2000), 51-86.[Lecluse et al., 1988] Chritophe Lecluse, Philippe Richard and Fernando Velez,O2, an object-oriented data model. ACM SIGMOD International Conferenceon Managing of Data 17, 5 (Sep. 1988), 424-433.[Liu, 1999] Mengchi Liu, Deductive database languages: problems and solutions,ACM Computing Surveys, 31, 1 (1999) 27-62.


73[Moss, 1994] Chris Moss, Prolog++ The Power of Object-Oriented andLogic Programming. Addison-Wesley, 1994.[Motro, 1994] Amihai Motro, Intensional answers to database queries. IEEETransaction on Knowledge and Data Engineering. 6,3 (Jun. 1994), 444-454.[Motschnig-Pitrik and Kaasboll, 1999] Renate Motschnig-Pitrik and Jens Kaasboll,Part-whole relationship categories and their application in objectorinentedanalysis. IEEE Transactions on Knowledge and Data Engineering,11, 5 (1999), 779-796.[Nahouraii and Petry, 1991] Ez Nahouraii and Fred Petry, Object Oriented Databases,IEEE Computer Society Press, 1991.[Niemi, 1983] Timo Niemi, A seven-tuple representation for hierarchical datastructures. Information Systems. 8, 3, (1983), 151-157.[Niemi et al., 1998] Timo Niemi, Marko Junkkari and Kalervo Järvelin, Deductiveobject-oriented approach to systems analysis and its representationwith the set theory. University of Tampere, Dept. of Computer and InformationSciences, Report A-1998-15, December 1998.[Niemi et al., 2000] Timo Niemi, Maria Christensen and Kalervo Järvelin, Querylanguage approach based on the deductive object-oriented database paradigm.Information and Software Technology 42 (2000), 777-792.[Niemi and Järvelin, 1991] Timo Niemi and Kalervo Järvelin, Prolog-basedmeta-rules for relational database representation and manipulation. IEEETransactions on Software Engineering. 17,8 (1991), 762-788.[Niemi and Järvelin, 1996] Timo Niemi and Kalervo Järvelin, The processingstrategy for the NF 2 relational frc-interface. Information and Software Technology.38 (1996) 11-24.[Paton et al., 1996] Norman Paton, Richard Cooper, Howard Williams andPhilip Trinder, Database Programming Languages. Prentice Hall, 1996.[Price et al., 2000] Modeling part-whole relationships for spatial data. In: Proc. ofthe Eighth ACM Symposium on Advances in Geographic Information Systems.1-8.[Rich and Knight, 1991] Elaine Rich, Kevin Knigth, Artificial Intelligence,McGraw-Hill, 1991.[Roth et al., 1988] Mark A. Roth, Henry F. Korth, and Abraham Silberschafz,Extended algebra and calculus for nested relational databases. ACMTransactions on Database Systems. 13, 4 (1988), 389-417.[Savnik et al., 1999] Iztok Savnik, Zahir Tari, Tomaz Mohoric. QAL: A queryalgebra of complex objects, Data & Knowledge Engineering, 30 (1999), 57-94.[Sterling and Shapiro, 1986] Leon Sterling and Ehud Shapiro, The Art of Prolog,The MIT Press, 1986.


74[Varzi, 1996] A.C.Varzi, Parts, wholes, and part-whole relations: Theprospects of mereotopology, Data & Knowledge Engineering 20 (1996), 259-286.[Wand et al., 1999] Yair Wand, Veda C. Storey and Ron Weber, An ontologicalanalysis of the relationship construct in conceptual modeling, ACM Transactionson Database Systems 24, 4 (December 1999), 494-528.[Winston et al., 1987] Morton E. Winston, Roger Chaffin and DouglasHerrmann. A taxonomy of part-whole relations, Cognitive Science, 11(1987), 417-444.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!