HTML

View Péter Király's profile on LinkedIn

20 éves a MEK, 10 éves az EPA Én is
MEK önkéntes
vagyok

20 éves a MEK
10 éves az EPA

kirunews

Király Péter, keresés, Lucene, Solr, Java, Perl, PHP, OAI-PMH, webfejlesztés, digitális könyvtár, MARC, FRBR, RDA, Drupal, EAD, EAC, Europeana, eXtensibleCatalog.org, MEK, és sok minden más.

Friss topikok

Linkblog

SPARQL röviden

2011.07.05. 22:44 kirunews

Az alábbi leírás a Jena nevű Java könyvtár SPARQL tutoriáljának, illetve a SPARQL szabványnak a rövidítése és némileg átdolgozása.

A SPARQL az RF-hez készült lekérdezőnyelv. Olyan, mint az SQL, vagy a kevésbé ismert XQuery, Z39.50 stb. Az a célja, hogy lehetővé tegye az RDF-ben tárolt tripletekből (állításhármasokból) álló adathalmazt. Mint annyi mást, ezt is a W3C szabványosította, elérhető innen: http://www.w3.org/TR/rdf-sparql-query/.

A SPARQL mint nyelv eléggé elterjedt ahhoz képest, hogy nincs hozzá túl sok megvalósítás. Ha az alábbi példákat, vagy ehhez hasonlóakat ki akarunk próbálni, legegyszerűbb, ha a CKAN archívumban keresünk olyan adatforrást, aminek van SPARQL végpontja. Aki saját SPARQL szervert akar építeni, annak a nyílt forráskódú Joseki szervert ajánlom (Java futtatókörnyezetet igényel), elérhető innen: http://joseki.org/. Ebben található néhány egyszerű (tényleg nagyon egyszerű) minta adatbázis, de könnyen lehet importálni (például a CKAN-ról letöltött) N3, Trutle (ttl) vagy RDF formátumú adathalmazokat.

1. Egyszerű SELECT

SELECT ?x
WHERE {
  ?x <http://www.w3.org/2001/vcard-rdf/3.0#FN> "John Smith"
}

Ahogy az RDF is alany-állítmány-tárgy (subject-predicate-object) hármasból ál össze, úgy a lekérdezés is. Az ?x egy változó. A SELECT utáni jelentése az, hogy ezt a változót szeretném visszakapni a kérdés futtatása után. A WHERE-en belül pedig az állítás alanyát jelenti. A kérdés magyarra fordítva tehát úgy hangzik, hogy keresem az alanyát azoknak az állításoknak, melyek valakiről azt mondják, hogy a családneve "Smith", egyszerűbben: keresem a Smith nevűeket.

2. Több mező SELECT-je

SELECT ?x ?fname
WHERE {
  ?x <http://www.w3.org/2001/vcard-rdf/3.0#FN> ?fname
}

Itt a visszaadott elemhez hozzáadtuk a nevet is, és nem szűkítettük a kört a Smithekre, hanem mindenkit lekérdezünk, akinek van családneve.

3. Több feltétel

SELECT ?givenName
WHERE {
  ?x <http://www.w3.org/2001/vcard-rdf/3.0#Family> "Smith" .
  ?x <http://www.w3.org/2001/vcard-rdf/3.0#Given> ?givenName
}

Keressük a Smithek keresztnevét.

4. Prefixek használata minősített nevek (QName) helyett

Ha a kérés elején deklarálunk egy névtér prefixet, akkor nem kell kiírnunk a teljes névteret a kérdés belsejében.

PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?givenName
WHERE {
  ?x vcard:Family "Smith" .
  ?x vcard:Given ?givenName
}

5. Mintaillesztés

 FILTER regex( ?x, "minta" [, "módosítók"])

A minta és módosítók az XQueryben definiált módon működnek, ami egyébként követi a Perlben megszokott szerkezetet.

SELECT ?g
WHERE {
  ?x vcard:Given ?g .
  FILTER regex(?g "r", "i")
}

Megkeresi azokat a keresztneveket, amelyek nagy vagy kis r betűt tartalmaznak (i = ignore case).

6. Értékalapú szűrés (csak semmi áthallás)

SELECT ?resource
WHERE {
  ?resource info:age ?age .
  FILTER (?age >= 24)
}
A 24 évesek és idősebbek leválogatása.

7. OPTIONAL - opcionális szűrés

Néha akkor kell szűrni, ha van mit. Ha nincs (mert adott mező nem található az adott állításban), akkor azokat az állításokat engedjük át. Többek között ezért is nevezik az RDF-et félig-struktúrált adatoknak, mivel megengedi bizonyos adatok hiányát (relációs adatbázisban mégha NULL értékkel is, de mindig ott van az adat).

SELECT ?name ?age
WHERE {
  ?person vcard:FN ?name .
  OPTIONAL {?person info:age ?age}
}

Ha van age tulajdonság, megjelenítjük. Ha nincs, üres értéke lesz az eredménylistában (ahelyett, hogy ezeket a rekordokat egyszerűen kihagynánk).

8. OPTIONAL kombinálása FILTER-rel

SELECT ?name ?age
WHERE {
  ?person vcard:FN ?name .
  OPTIONAL {?person info:age ?age .
            FILTER (?age > 24)      }
}

Ha van életkor tulajdonság, akkor csak a 24 évnél idősebbeket jelenítjük meg, illetve azokat, akik esetében nem ismert ezen tulajdonság értéke.

9. Metszet (UNION)

Az RDF természetéből következik, hogy ugyanazt a tulajdonságot több névtés is definiálja. Bár törekedni kell az egységesítésre, egy aggregált adathalmaznál erre nem mindig van mód. Ekkor jól jöhet az UNION.

SELECT ?name
WHERE {
  { [] foaf:Name ?name } UNION { [] vcard:FN ?name }
}

Ugyanezt FILTER alkalmazásával is el lehet érni:

SELECT ?name
WHERE {
  [] ?p ?name
  FILTER (?p = foaf:Name || ?p = vcard:FN)
}

Persze vannak esetek, hogy meg akarjuk őrizni azt, hogy mi is volt a tulajdonság neve a forrásban:

SELECT ?name1 ?name2
WHERE {
  { [] foaf:Name ?name1 } UNION { [] vcard:FN ?name2 }
}

Végül ugyanez OPTIONAL-lal:

SELECT ?name1 ?name2
WHERE {
  ?x a foaf:Person
  OPTIONAL { ?x foaf:name ?name1 }
  OPTIONAL { ?x vcard:FN ?name2 }
}

10.

Szólj hozzá!

A bejegyzés trackback címe:

http://kirunews.blog.hu/api/trackback/id/tr563042859

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben.

Nincsenek hozzászólások.

Tetszett a bejegyzés? Kövesd a blogot!

blog.hu