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).
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:
Seznam aktuálních NoSQL databází naleznete na webu nosql-database.org.
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.
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/.
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
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.
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
MATCH
CREATE
, WHERE
, RETURN
, DELETE
a další.
WHERE
MATCH
.
RETURN
MATCH
) nebo vytváříme (CREATE
).
DELETE
MATCH
.
MERGE
CREATE
a MERGE
. Pokud daný objekt v databázi neexistuje, je vytvořen, jinak je vrácen.
Prostřednictvím poskytnutého skriptu Neo4j data
vytvořte grafovou databázi, která bude obsahovat:
Osoba
, každý s vlastnostmi jmeno
a role
Predmet
, každý s vlastnostmi nazev
a kredity
Pracoviste
, každý s vlastností nazev
UCI
, každá s vlastností typ
, které propojují uzly Osoba
a Predmet
PRACUJE
, které propojují uzly Osoba
a Pracoviste
ZAHRNUJE
, které propojují mezi sebou uzly Pracoviste
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)
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.
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.
Martin Zíma
:
MATCH (o:Osoba { jmeno: "Martin Zíma" }) RETURN o
MATCH (o:Osoba) RETURN o.jmeno
Martin
(použití regulárních výrazů):
MATCH (o:Osoba) WHERE o.jmeno =~ "Martin.*" RETURN o
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.
NTIS
u. Oba dotazy jsou identické, ve druhém je obrácené pořadí:
MATCH (p:Pracoviste { nazev: "Nové technologie pro informační společnost" })<-[:PRACUJE]-(o:Osoba) RETURN o.jmeno MATCH (o:Osoba)-[:PRACUJE]->(p:Pracoviste { nazev: "Nové technologie pro informační společnost" }) RETURN o.jmeno
DB2
. Druhý dotaz řeší to samé, jen místo uzlů vrací jména těchto osob:
MATCH (o:Osoba)-[:UCI { typ: "cvičení" }]->(p:Predmet { nazev: "Databázové systémy 2" }) RETURN o MATCH (o:Osoba)-[:UCI { typ: "cvičení" }]->(p:Predmet { nazev: "Databázové systémy 2" }) RETURN o.jmeno
DB2
stejně jako osoba nesoucí jméno Jana Klečková
:
MATCH (o:Osoba { jmeno: "Jana Klečková" })-[:UCI]->(p:Predmet { nazev: "Databázové systémy 2" })<-[:UCI]-(u:Osoba) RETURN u
Ve vytvořené grafové databázi lze přímo řešit čistě grafové úlohy.
MATCH (p:Pracoviste)-[*3]-(u) WHERE p.nazev = "Fakulta aplikovaných věd" RETURN DISTINCT u MATCH (p:Pracoviste)-[*2..4]-(u) WHERE p.nazev = "Fakulta aplikovaných věd" RETURN DISTINCT u
MATCH path = shortestPath( (p1:Pracoviste { nazev: "Fakulta aplikovaných věd" })-[*]-(p2:Predmet { nazev: "Databázové systémy 2" }) ) RETURN path MATCH path = shortestPath( (p1:Pracoviste { nazev: "Fakulta aplikovaných věd" })-[*..5]-(p2:Predmet { nazev: "Databázové systémy 2" }) ) RETURN path
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
Spusťte si příkaz :play movie graph
a postupně vykonávejte příkazy v jednotlivých krocích.
Copyright © 2020 Martin Zíma