NoSQL databáze

Databáze, které nejsou založené na relačním datovém modelu (tj. nejsou relační). Dovedou zpracovávat obrovské množství dat v reálném čase a zpravidla jsou distribuované a otevřené. V databázích se obvykle neřeší transakční zpracování (ACID), ale data jsou snadno dostupná vždy i v částečně konzistentním stavu (BASE).


Základní kategorizace

Přibližně od roku 2008 ke dnešnímu dni existují stovky NoSQL databázových systémů pro různé způsoby využití. Během tohoto času došlo k jejich základnímu rozdělení, minimálně na tyto 4 základní kategorie:

  1. Klíč-hodnota (Key Value, případně Tuple Store): Do databáze se obvykle ukládá dvojice: klíč a jeho hodnota. Na základě znalosti klíče jsme schopni z databáze získat uloženou hodnotu. Typickými zástupci jsou: Redis, Riak a další.
  2. Dokumentové (Document Store): Do databáze se ukládají dokumenty ve formátech JSON, případně BSON. Každý ukládaný dokument může mít jinou strukturu. Typickými zástupci jsou: MongoDB, Elasticsearch a další.
  3. Sloupcové (Wide Column Store, případně Column Families): Ke každému klíči je možné uložit více hodnot odpovídající příslušnému sloupci. Každý klíč může mít vyplněné hodnoty jiných sloupců. Typickými zástupci jsou: Apache Hadoop, Apache Cassandra a další.
  4. Grafové (Graph Databases): Do databáze se ukládají uzly a jejich vlastnosti a také hrany mezi těmito uzly. Hlavním přínosem je vyhledání příslušných uzlů v rozsáhlém grafu na základě implementovaných grafových algoritmů, který je neporovnatelně rychlejší, než běžná relační databáze. Typickými zástupci jsou: Neo4j, Infinite Graph a další.
  5. Vícemodelové (Multimodel Databases): Kombinují více modelů do jediné databáze. Obvykle se kombinují grafové databáze s dokumentovými nebo s databázemi klíč-hodnota. Typickým zástupcem jsou ArangoDB, OrientDB a další.

Seznam aktuálních NoSQL databází naleznete na webu nosql-database.org.


Databáze klíč-hodnota: Web storage

Každý moderní internetový prohlížeč má implementováno webové úložiště, které funguje na principu databáze klíč-hodnota. Toto úložiště pracuje ve dvojím režimu:

Výše uvedené lze snadno otestovat podle ukázek na w3schools.


Grafové databáze: Neo4j

Za vývojem databáze Neo4j je společnost Neo Technology, Inc., která také stojí za vývojem ovladačů pro připojení k databázi. Databáze Neo4j je šířena ve dvou edicích, a to Community a Enterprise, která je placená. Community edice je šířena jako open source a je multiplatformní. Stáhnout si ji můžete z adresy https://neo4j.com/download/other-releases/.


Instalace a konfigurace

Stáhneme si odpovídající verzi (archiv) pro naši platformu a rozbalíme ji do námi zvoleného adresáře, kam máme právo zápisu. Pokud chceme nastavit, kde si má Neo4j server založit datové úložiště, musíme editovat konfigurační soubor neo4.conf, který se nachází v adresáři conf, jinak využije výchozí nastavení. Předpokládejme, že máme připravený adresář D:\Database\Neo4j\data pro naše datové úložiště. Pak v konfiguračním souboru nastavíme:

dbms.directories.data=D:\\Database\\Neo4j\\data

Vytvoření databáze na lokálním uzlu

V prostředí, které používáme my, můžeme spustit pouze neo4j consoli z adresáře bin:

neo4j.bat console

Ta založí, pokud ještě neexistuje, databázi na lokálním uzlu a připojí se k němu. Činnost uzlu ukončíme kombinací kláves CTRL+C a potvrdíme klávesou Y. Práce s databází je nabízena prostřednictvím internetového prohlížeče. Stačí zadat tuto adresu:

http://localhost:7474

Po prvním připojení k databázi výše uvedenou adresou jsme vyzváni k přihlášení. Výchozím účtem je neo4j se stejným heslem. Po zadání tohoto hesla jsme vyzváni k jeho změně. Nelze zadat stejné heslo, jinak nejsou na něj kladena žádná omezení. Po nastavení nového hesla proběhne samotné připojení k databázi. Co je trochu zvláštní, že po restartu databázového serveru není pro připojení se k databázi nastavené heslo třeba.


Dotazovací jazyk Cypher

Spusťte si příkaz :help cypher a procházejte si syntaxe jednotlivým příkazů. Těmi lze v databázi objekty (uzly, hrany, vlastnosti) vytvářet, vybírat a také rušit. Z nejčastěji používaných příkazů vybírám tyto:

CREATE
příkazem lze v grafové databázi vytvořit uzel, hranu (relaci) mezi danými uzly, obojí včetně vlastností. Jedním příkazem lze vytvořit více objektů, vytvářené objekty jsou oddělené čárkou.

MATCH
příkazem lze vybrat/popsat objekty uložené v grafové databázi, se kterými chceme dále pracovat. S tímto příkazem jsou spojeny další příkazy: CREATE, WHERE, RETURN, DELETE a další.

WHERE
příkazem specifikujeme podmínku výběru, stejně jako v SQL. Příkaz je obvykle spojen s příkazem MATCH.

RETURN
příkaz vrací objekty či data (hodnoty atributů objektů), které vybíráme (MATCH) nebo vytváříme (CREATE).

DELETE
příkaz maže objekty z grafové databáze, které jsou vybrány příkazem MATCH.

MERGE
příkaz do sebe spojuje příkazy CREATE a MERGE. Pokud daný objekt v databázi neexistuje, je vytvořen, jinak je vrácen.

Vytvoření grafu

Prostřednictvím poskytnutého skriptu Neo4j data vytvořte grafovou databázi, která bude obsahovat:

Pokud bychom chtěli přidat další relaci v nové transakci, musí příkazu CREATE předcházet příkaz MATCH, kterým vyhledáme existující uzly, které chceme propojit, např.:

MATCH (o:Osoba { jmeno: "Martin Zíma" })
MATCH (p:Predmet { nazev: "Informační systémy" })
CREATE (o)-[:UCI { typ: "cvičení" }]->(p)

Zobrazení grafu

Z databáze lze získat jak uložená data (obvykle vlastnosti a jejich hodnoty uzlů či relací), tak také v grafickém režimu jednotlivé části grafu či celé podgrafy. Získání této informace je realizováno příkazem RETURN, kterému předchází příkaz MATCH, obvykle doplněný konstrukcí WHERE.

Zobrazení celého obsahu databáze (nemusí to být jen jeden graf) provedeme následujícím příkazem, kde nás nezajímá, jaké uzly v grafu mají být. Relace mezi těmito uzly budou doplněny (zobrazeny) automaticky, pokud je v prohlížeči aktivní volba Connect result nodes.

MATCH (uzel) RETURN uzel

Pokud nechceme brát ohled na volbu Connect result nodes, musíme vybírat kromě uzlů také obousměrné relace.

MATCH (uzel)-[relace]-() RETURN uzel, relace

Vybrání a zobrazení konkrétního grafu či podgrafu může vypadat takto. První případ využívá aktivní volby Connect result nodes, druhý ne.

MATCH (o:Osoba), (p1:Predmet), (p2:Pracoviste) RETURN o, p1, p2

MATCH (o:Osoba)-[r1]-(), (p1:Predmet)-[r2]-(), (p2:Pracoviste)-[r3]-() RETURN o, p1, p2, r1, r2, r3

Graf či podgraf lze snadno vybrat z prohlížeče ze stránky Database information. Zde jsou dostupné popisky všech uzlů a relací a také všechny uložené vlastnosti. Jedním klikem vyberete a zobrazíte požadovanou informaci.


Hledání uzlů a jejich vlastností

Příkazem MATCH lze vyhledat konkrétní uzly nebo jejich vlastnosti. Pokud konstrukce RETURN vrací jen vlastnosti, není na výstupu dostupný graf, jen odpovídající data. Stejně jako v SQL i zde platí, že každý dotaz lze zapsat několika ekvivaletními způsoby.


Hledání v grafu

Pokud chceme hledat uzly (či jen jejich vlastnosti), které jsou závislé na jiných uzlech, je nezbytné v dotazu specifikovat také alespoň jednu relaci. Relace může mít uvedenu orientaci (je zakončena šipkou) nebo bez orientace, pak platí oba směry.


Řešení grafových úloh

Ve vytvořené grafové databázi lze přímo řešit čistě grafové úlohy.


Smazání grafu včetně hran

V databázi lze mazat jen uzel, který není propojen žádnou relací. Jdená se o obdobu restriktivního referenčního integritního omezení. Pokud nevíme, zda daný uzel je propojen nějakou relací, preventivně takové relace získáme příkazem OPTIONAL MATCH a smažeme je současně s propojovanými uzly příkazem DELETE. Smazání celé grafové databáze provedeme takto:

MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

Pokud chceme z databáze smazat vybrané uzly a relace které z nich vystupují či do nich vstupují, příkazem MATCH či konstrukcí WHERE stanovíme podmínky, které vybrané uzly mají splňovat. Např. chci smazat všechny uzly označující předměty:

MATCH (p:Predmet) OPTIONAL MATCH (p)-[r]-() DELETE p, r

Ukázková grafová filmová databáze

Spusťte si příkaz :play movie graph a postupně vykonávejte příkazy v jednotlivých krocích.

Copyright © 2020 Martin Zíma