Databázové systémy 2 (KIV/DB2)
RDF & SPARQL

Petr Včelák
vcelak@kiv.zcu.cz


Table of Contents


1 Sémantický web

1.1 Úvod

1.2 Vrstvy sémantického webu

  1. Unicode + Jednoznačné identifikátory (URI, IRI) – lokalizace a jméno
  2. XML + jmenné prostory + XML Schema
  3. RDF + RDF Schema
  4. Ontologie (OWL)
  5. Logika, usuzování, odvozování znalostí (tvrzení) – odvozovací pravidla (rules)
  6. Důkaz a dokazatelnost (proof)
  7. Důvěra (trust, digital signature, cryptography)
  8. Uživatelské rozhraní a aplikace
Figure 1 Semantic Web Layers – 2001
figure 20170220-semantic_web_levels-2001.png
Zdroj: W3C Semantic Web Activity. (2001, November 2). In Semantic Web Kick-off. Retrieved April 10, 2017, from https://www.w3.org/2001/12/semweb-fin/w3csw
Figure 2 Semantic Web Stack – 2015
figure 20170406-semantic-web-stack-2015.png Zdroj: Semantic Web Stack. (2015, September 17). In Wikipedia, The Free Encyclopedia. Retrieved April 10, 2017, from https://en.wikipedia.org/w/index.php?title=Semantic_Web_Stack


2 RDF

2.1 Princip a popis RDF trojice


2.2 Ilustrace převodu tvrzení do RDF

Příklad tvrzení: „Rozvrhovou akci v pondělí 9.20 vede Petr.“ lze zapsat do trojice:
zdroj = Rozvrhová akce v pondělí 9.20,
vlastnost = vede,
objekt = Petr.
Vidíme, že tam jsou i další tvrzení, které se vztahují k rozvrhové akci a blíže ji specifikují. Jak budou vypadat další tvrzení?
Další tvrzení přepsaná RDF trojicemi:
1<zdroj>                         <vlastnost> <objekt>  .
2=======================================================
3<Rozvrhová akce v pondělí 9.20> <vede>      <Petr>    .
4<Rozvrhová akce v pondělí 9.20> <den>       <pondělí> .
5<Rozvrhová akce v pondělí 9.20> <zacina>    <9.20>    .
6<9.20>                          <hodin>     <9>       .
7<9.20>                          <minut>     <20>      .
8...
Výše uvedený zápis (bez prvních dvou řádek) se označuje N-TRIPLE a každá trojice je vždy na samostatném řádku ukončená znakem tečky. Zdroje jsou uzavřeny ve špičatých závorkách a text je v uvozovkách.

2.3 Identifikátory

V našem příkladě použijeme např. jmenný prostor http://zcu.cz/rdf/ a zdroje i vlastnosti jím identifikujeme:
1<zdroj>               <vlastnost>                 <objekt>              .
2=========================================================================
3<http://zcu.cz/rdf/1> <http://zcu.cz/rdf/vede>    "Petr"                .
4<http://zcu.cz/rdf/1> <http://zcu.cz/rdf/den>     "pondělí"             .
5<http://zcu.cz/rdf/1> <http://zcu.cz/rdf/zacina>  <http://zcu.cz/rdf/2> .
6<http://zcu.cz/rdf/2> <http://zcu.cz/rdf/hodin>   "9"                   .
7<http://zcu.cz/rdf/2> <http://zcu.cz/rdf/minut>   "20"                  .
8...

2.4 Datový typ a jazyk hodnoty


2.5 Slovníky a jmenné prostory


2.6 Používané notace RDF dat

Pro účely přehlednějšího a stručnějšího (úspornějšího) zápisu se používají prefixy i další notace.
Pro stejný příklad popisu pondělní rozvrhové akce použijeme další zápisy.
  1. Přímo výše uvedený příklad zapíšeme v notaci Turtle:
    1<http://zcu.cz/rdf/1> 
    2	http://zcu.cz/rdf/:vede    "Petr"    ;
    3	http://zcu.cz/rdf/:den     "pondělí" ;
    4	http://zcu.cz/rdf/:zacina  http://zcu.cz/rdf/2     .
    56<http://zcu.cz/rdf/2> 
    7	http://zcu.cz/rdf/:hodin   "9"       ;
    8	http://zcu.cz/rdf/:minut   "20"      .
    
    • Tvrzení patřící stejnému subjektu oddělujeme středníkem, více hodnot u stejné vlastnosti oddělujeme čárkou a za posledním tvrzením je tečka.
  2. Ke zvolenému jmennému prostoru nadefinujeme prefix zcu a data ve výše uvedené notaci Turtle budou:
    1@prefix zcu: <http://zcu.cz/rdf/> .
    23<http://zcu.cz/rdf/1> 
    4	zcu:vede    "Petr"    ;
    5	zcu:den     "pondělí" ;
    6	zcu:zacina  zcu:2     .
    78<http://zcu.cz/rdf/2> 
    9	zcu:hodin   "9"       ;
    10	zcu:minut   "20"      .
    
    • Ve formátu Turtle může být na začátku deklarace prefixů začínající znakem zavináče a slovem prefix, za nímž následuje vlastní prefix a za dvojtečkou úplné URI/IRI jmenného prostoru za kterým je tečka.
  3. Na závěr ještě stejný zápis v provedení notace RDF/XML:
    1<rdf:RDF xmlns:zcu="http://zcu.cz/rdf/">
    2  <rdf:Description rdf:about="http://zcu.cz/rdf/1">
    3    <zcu:vede>Petr</zcu:vede>
    4    <zcu:den>pondělí</zcu:den>
    5    <zcu:zacina>
    6      <rdf:Description rdf:about="http://zcu.cz/rdf/2">
    7        <zcu:hodin>9</zcu:hodin>
    8        <zcu:minut>20</zcu:minut>
    9      </rdf:Description>
    10    </zcu:zacina>
    11  </rdf:Description>
    12</rdf:RDF>
    
    • Používá se jmenný prostor rdf, který je rezervovaný. Prefixy jsou definovány v kořenovém elementu rdf:RDF.
  4. Příklad v základní RDF/XML notaci včetně použitého RDF jmenného prostoru:
    1<?xml version="1.0"?>
    2<rdf:RDF
    3xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    4xmlns:zcu="http://zcu.cz/rdf/">
    5  <rdf:Description rdf:about="http://zcu.cz/rdf/1">
    6    <zcu:vede>Petr</zcu:vede>
    7    <zcu:den>pondělí</zcu:den>
    8    <zcu:zacina rdf:resource="http://zcu.cz/rdf/2" />
    9  </rdf:Description>
    10  <rdf:Description rdf:about="http://zcu.cz/rdf/2">
    11    <zcu:hodin>9</zcu:hodin>
    12    <zcu:minut>20</zcu:minut>
    13  </rdf:Description>
    14</rdf:RDF> 
    
  5. Uvedené serializace RDF dat jsou vzájemně převoditelné – bezztrátově.
    • Obvykle záleží na aplikaci, v jaké notaci data vyžaduje.
    • Lze serializovat také do formátu JSON.


2.7 Přidání tvrzení

2.8 Porovnání OOP s RDF

2.9 Porovnání s relační databází

Schéma databáze = datový model je pevně definován
Tabulka = entita
Sloupec tabulky = atribut entity
Datový typ atributu = povolený datový typ hodnot
Záznam = řádek tabulky


3 Vývoj a vývojové nástroje

4 SPARQL – dotazovací jazyk


Ukázková data
# https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#construct
@prefix  foaf:  <http://xmlns.com/foaf/0.1/> . # Friend-of-a-Friend
​
<abc> foaf:name "Alice" .
<abc> foaf:mbox <mailto:alice@example.org> .
Typy dotazů jsou:
SELECT všechny nebo podmnožinu proměnných z podmínkové části
CONSTRUCT vrací RDF graf sestavený dle šablony trojic
ASK odpověď je datového typu boolean;
DESCRIBE vrací RDF graf popisující zdroj


5 SPARQL – řešené příklady

5.1 Schéma dat v systému MRE

Figure 3 Schéma vybraných tříd a vlastností v systému MRE
figure mre-lite.png


5.2 Připravená RDF data

Použité datové formáty (koncovka):
nt N-TRIPLE
ttl TURTLE
xml RDF/XML

5.3 Používané jmenné prostory

PREFIX id:    <http://mre.zcu.cz/id/>
PREFIX ds:    <http://mre.zcu.cz/ontology/dasta.owl#>
PREFIX dscl:  <http://mre.zcu.cz/ontology/dscl.owl#>
PREFIX dcm:   <http://mre.zcu.cz/ontology/dcm.owl#>
PREFIX sits:  <http://mre.zcu.cz/ontology/sits.owl#>
PREFIX nihss: <http://mre.zcu.cz/ontology/nihss.owl#>
PREFIX mre:   <http://mre.zcu.cz/ontology/mre.owl#>
​
PREFIX acl:   <http://www.w3.org/ns/auth/acl#>
PREFIX dc:    <http://purl.org/dc/elements/1.1/>
PREFIX nfo:   <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#>
PREFIX owl:   <http://www.w3.org/2002/07/owl#>
PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd:   <http://www.w3.org/2001/XMLSchema#>


5.4 SPARQL Server – Apache Fuseki


5.5 Data příkladů – pacient Anon_666

id:cd3f0c85b158c08a2b113464991810cf2cdfc387
  a                 ds:Patient , ds:Male ;
  ds:address        id:3840aecb9edac9f7d7c9172f2f4be82b08ab3ddf ;
  ds:clinicalEvent  id:be8d011f882326495f8d06c58f22db51d95cc7bf ;
  ds:datetimeBirth  "1938-08-13"^^xsd:date ;
  ds:lastName       "Anon_666" ;
  ds:patientID      "666" ;
  ds:sex            "M" ;
  ds:sexNCLPTPS     dscl:NCLPTPS_M ;
  ds:sexPOHLAV      dscl:POHLAV_1 ;
  dc:title          "Anon_666 (M) * 1938-08-13" .
​
id:3840aecb9edac9f7d7c9172f2f4be82b08ab3ddf
  a               ds:PermanentAddress ;
  ds:addressCity  "Město 1" ;
  ds:addressZIP   "00001" ;
  dc:title        "Město 1 (00001)" .
​
id:be8d011f882326495f8d06c58f22db51d95cc7bf
  a                          ds:MedicalExamination ;
  ds:datetimeEvent           "2012-09-19T23:20:00+0200"^^xsd:dateTime ;
  ds:diagnosis               id:2c545600eb7a2722809d64c2753de714a5154b6b ,
                             id:2285692c932c88f8673a162ef7b5c997993da41c ;
  ds:dsclExaminationContent  dscl:LZSOZ_NL ;
  ds:dsclExaminationOrigin   dscl:LZTOZV_J ;
  ds:dsclExaminationRequest  dscl:LZTZOV_D ;
  ds:dsclExaminationState    dscl:LZSZZ_K ;
  ds:imagingStudyNumber      "00000078" ;
  ds:originator              id:44040e7024d5a4cc177bf0ed29683c2185dbd05b ;
  ds:reportText              "CT mozku:..." ;
  ds:reportTitle             "032/002 - CT mozku: s k.l. iv." ;
  dc:title                   "2012-09-19 23:20: 032/002 - CT mozku: s k.l. iv." .
​
id:2c545600eb7a2722809d64c2753de714a5154b6b
  a                 ds:ActualDiagnosis ;
  ds:datetimeEvent  "2012-04-18"^^xsd:date ;
  ds:diagCode       dscl:MKN10_5_J180 ;
  ds:diagDetail     "Bronchopneumonie NS" ;
  ds:diagOrder      1 ;
  ds:patient        id:cd3f0c85b158c08a2b113464991810cf2cdfc387 ;
  dc:title          "2012-04-18 (1) J18.0 - Bronchopneumonie NS" .
​
id:2285692c932c88f8673a162ef7b5c997993da41c
  a                 ds:ActualDiagnosis ;
  ds:datetimeEvent  "2012-04-18"^^xsd:date ;
  ds:diagCode       dscl:MKN10_5_I639 ;
  ds:diagDetail     "Mozkový infarkt" ;
  ds:diagOrder      2 ;
  ds:patient        id:cd3f0c85b158c08a2b113464991810cf2cdfc387 ;
  dc:title          "2012-04-18 (2) I63.9 - Mozkový infarkt" .
​
id:44040e7024d5a4cc177bf0ed29683c2185dbd05b
  a                  ds:OriginatorDepartment ;
  ds:departmentName  "Nemocnice na ..." ;
  dc:title           "Nemocnice na ..." .


5.6 Jednoduché dotazy

5.6.1 Všechny existující trojice

5.6.2 Rodné číslo pacienta pro známé URI

5.6.3 URI pacienta pro známé rodné číslo

5.6.4 Všechny vlastnosti a hodnoty pro zadané URI

5.6.5 URI všech pacientů a jejich rodných čísel

5.6.6 Rodné číslo a příjmení pro zadané URI pacienta

5.6.7 Další identifikátory a rodné číslo s příjmením pacientů

5.6.8 Rodná čísla a příjmení pacientů s rodným číslem větším než 500

5.6.9 Pacienti s datem narození v určeném období

5.6.10 Všechna rodná čísla a příjmení pacientů – seřazených dle rodného čísla

5.6.11 URI všech instancí třídy aktuální diagnózy

5.6.12 Ověření získaných znalostí

Použijte zejména data patient7-medical a ověřte, že vaše dotazy vrací správné výsledky pro níže uvedené příklady.
  1. Příklad 12-1a – Pro všechny pacienty vypište hodnoty sloupců:
    • rodné číslo,
    • příjmení,
    • datum narození,
    • datum úmrtí,
    • pohlaví (pouze písmeno M nebo F),
    • anotace zdroje (instance) z dc:title a současně i rdfs:label,
    • numericky seřaďte vzestupně dle rodného čísla.
  2. Příklad 12-1b – Upravte příklad 12-1a omezením výčtu pacientů pouze na jednoho explicitním zadáním URI.
  3. Příklad 12-1c – Upravte příklad 12-1a omezením výčtu pacientů na min. dva nebo tři pacienty zadané prostřednictvím známého URI.
  4. Příklad 12-2 – Upravte příklad 12-1a omezením na pacienty mužského pohlaví prostřednictvím:
    1. filtru hodnoty (12-2a),
    2. instance pacientů třídy ds:Male (12-2b).


5.7 Průchod grafu

5.7.1 Příjmení a rodné číslo pacientů společně s datem a časem z lékařské zprávy

5.7.2 Diagnózy pacientů

5.7.3 Ověření získaných znalostí

  1. Je chybou, že zde není v příkladech 14a a 14b uvedena třída – rdf:type (ds:MedicalExamination)?
  2. Dotazem zjistěte, kolik je v datech patient7-medical instancí ds:LaboratoryReport?
  3. Doplňte do 14a nebo 14b řazení, dle pořadového čísla diagnózy.
  4. Doplňte do 14a nebo 14b omezení, abychom získali pouze hlavní diagnózy (mají hodnotu 1 ve vlastnosti ds:diagOrder).
  5. Co je potřeba v datech změnit/přidat, abychom v předchozí úloze nepotřebovali použít FILTER?
  6. Podívejte se na data (na schéma výše není uvedeno) a najděte další způsob, jak jinak vypsat stejné výsledky. Vytvořte odpovídající dotaz.


5.8 Samostatné úlohy

Pro následující úlohy použijte současně data patient7-medical a patient7-imaging.
Úlohy
  1. Vyberte datum s časem všech laboratorních výsledků bez duplicit a seřazené od nejnovějších k nejstarším.
    • Řešení má být 37 výsledků.
  2. Najděte a vypište všechny URI diagnóz, které jsou v datech použity (ds:DiagCode) a abecedně je seřaďte.
    • Řešení má být 29 výsledků.
  3. Zjistěte počet DICOM studií (dcm:Study)?
    • Řešení má být jeden výsledek s hodnotou 1 (DICOM studií).
  4. Zjistěte, jakým pacientům a které DICOM studie patří – uveďte jeho rodné číslo ds:patientID a číslo studie dcm:Study_ID.
    • Řešení má být jeden výsledek s pacientem 592 a studií 832.
  5. Zjistěte počet DICOM sérií (dcm:Series)?
    • Řešení má být jeden výsledek s hodnotou 10 (DICOM sérií).
  6. Zjistěte počet DICOM snímků (dcm:CT_Image)?
    • Řešení má být jeden výsledek s hodnotou 550 (DICOM snímků).
  7. Zjistěte z kolika DICOM souborů (snímků dcm:CT_Image) se každá ze sérií skládá, a seřaďte je od největší k nejmenší? Vypište číslo série (dcm:Series_Number), popis (dcm:Series_Description) a počet souborů v sérii.
    • Řešení má být 7 výsledků (sérií) s počty souborů: 304, 116, 70, 31, 24, 4 a 1.
  8. Zjistěte z kolika DICOM souborů (snímků dcm:CT_Image) se každá ze sérií skládá, a jaký objem dat na disku zabírá? Vypište číslo série (dcm:Series_Number), popis (dcm:Series_Description), počet souborů v sérii, celkovou velikost série v B i současně v MB. Hodnotu velikosti v MB zaokrouhlete. Série seřaďte dle velikosti v Bytech.
    • Řešení má být 7 výsledků (sérií) s velikostmi (MB): 156, 59, 35, 16, 12, 1 a 0.
  9. Najděte laboratorní výsledky, jejichž hodnoty (ds:labNumberValue) jsou mimo stanovené referenční meze pro daného pacienta:
    • ds:labScale4 je referenční mez dolní,
    • ds:labScale5 je referenční mez horní,
    a vypište unikátní název naměřené veličiny (ds:labLocalName), hodnotu, a obě referenční meze. Data budou řazena vzestupně dle názvu, dolní meze, hodnoty a horní meze.
    1. Neuvažujte datum laboratorního výsledku.
      • Řešení má být 171 výsledků.
    2. Uvažujte datum laboratorního výsledku. Zobrazen bude bezprostředně za názvem. Stejně tak u řazení, nejprve název a pak dle data, následovat budou zbývající hodnoty.
      • Řešení má být 216 výsledků.
    3. Zjistěte, kolikrát byly laboratorní hodnoty (název, ds:labLocalName) mimo stanovené meze. Zobrazit pouze ty, které se opakují (alespoň 2x) a seřadit dle počtu (sestupně) a názvů (vzestupně).
      • Řešení má být 25 výsledků. (Celkem je hodnot mimo referenční meze 47.)