Neo4j tutorial - podstawy grafowej bazy danych - część 1
Organizacja relacyjnych baz danych
Ten materiał został napisany byś mógł(mogła) zapoznać się z grafową bazą danych Neo4j i rozpocząć jej wykorzystywanie w swoich projektach. Zapewnie masz co najmniej ogólne pojęcie jak wygląda przechowywanie danych w relacyjnych bazach danych (RDBMS). Typowa firma przechowuje informacje o swoich klientach, produktach którymi handluje, informacje o dokonanej sprzedaży.
A więc relacyjne bazy danych przechowują ustrukturyzowane dane w tabelach z ustalonymi kolumnami określonych typów. Jeśli jest to np. tabela która przechowuje informacje o klientach możemy mieć tam kolumnę np. "numer klienta" z typem danych numer i "nazwisko klienta" jako varchar/text. Każda więc relacyjna baza danych ma swój schemat; abstrakcyjny wzór, który reprezentuje przechowywanie danych w bazie danych. Opisuje zarówno organizację danych, jak i relacje między tabelami w danej bazie danych.
W relacyjnych bazach danych odwołania do wierszy w innych tabelach są realizowane przez odwoływanie się do atrybutów kluczy. Na przykład by połączyć produkty z właściwym klientem odwołujemy się do klucza "numer klienta" w obu tabelach.
W twojej tabeli przechowującej klientów masz z pewnością wiecej kolumn które przechowują informacje o każdym z klientów. Jeśli nie posiadasz któregoś z atrybutów klienta (np. dla części nie znasz ich adresu), ci klienci ciągle mają kolumny "adres" z typem danych, nawet jeśli są puste. Każda z kolumn tabeli musi mieć też zdefiniowany typ danych przed wgraniem tam danych. Zobaczysz poniżej że zupełnie inaczej wygląda to w Neo4j.
Organizacja danych w Neo4j
W grafowej bazie danych nie znajdziemy tabel i kolumn. W Neo4j mamy trzy podstawowe elementy: nodes (węzły), relations (relacje) i properties (właściwości). Razem tworzą "model grafu". Dlaczego "grafu"? Bo struktura tych obiektów tworzy graf: węzły połączone są krawędziami (relacjami) tworząc graf. Jego przykład może wyglądać jak poniżej:
Węzły
Zwykle jest to rzeczownik określający osobę, przedmiot, obiekt. W naszych tabelach powyżej mogłby to być produkt lub klient. Węzły posiadają etykiety (labels). Możemy więc mieć węzeł który ma etykietę "klient" lub etykietę "produkt".
Relacje
Relacje zwykle wyrażone są czasownikami i definiują co łączy jeden węzeł z drugim. By odnotować faktu zakupu przez klienta danego produktu, utworzylibyśmy między węzłem klient a węzłem produkt relację która moglibyśmy nazwać "kupił". Każda relacja w Neo4j ma kierunek - ta nasza przykładowa "kupił" biegnie od klienta do produktu. Czasami kierunek relacji jest ważny, czasami mniej (klient kupił ten produkt ale dowiedzieć się możemy też idąc w drugą stonę ze produkt został kupiony przez tego klienta - nie musimy budować takiej relacji).
Właściwości
Właściwości opisują węzły. Są też kluczami dzięki którym możemy znaleźć właściwe informacje. Np. węzeł "klient" może mieć właściwości "numer klienta", "nazwisko klienta", "adres". Co nie oznacza że wszystkie węzły z etykietami "klient" muszą mieć takie same właściwości - niektóre węzły mogą nie posiadać właściwości "adres" lub "kod pocztowy". Nie tak jak w relacyjnej bazie danych gdzie każdy wiersz musi posiadać wszystkie kolumny niezależnie czy są wypełnione czy też nie. Dlatego Neo4j jest bazą "schema-less" (bez schematu). Każdą właściwość możesz dodać do węzła lub usunąć z węzła później.
Wizualizacja relacji między klientem który zakupił produkt wygląda jak na diagramie niżej - dwa węzły które posiadają swoje właściwości, połączone są relacją "kupił" która także ma swoją właściwość ("data zakupu").
Przygotowanie środowiska do testów
Środowisko testowe bazy Ne4j możesz stworzyć w jeden z dwóch sposobów: wykorzystać gotowy Neo4j sandbox lub pobrać bazę w wersji community ze strony Neo4j. Jeśli zdecydujesz się zainstalować wersję community na swoim komputerze, jej instalacja jest banalnie prosta - wystarczy rozpakować pobrany zip (Neo4j Community Edition), przejść do podkatalogu "bin" instalacji i z linii poleceń wpisać "neo4j console" by uruchomić program. Neo4j wykorzystuje środowisko Java w wersji 11 (JRE lub JDK). Szczegóły instalacji znajdziesz pod tym linkiem.
Logowanie do Neo4j
W tym tutorialu wykorzystywać będziemy lokalną instalację Neo4j. Jeśli zdecydujesz sie na gotowy sandbox - logowanie będzie wyglądać nieco inaczej. Jeśli zatem zalogowałe(a)ś Neo4j lokalnie, patrz punkt wyżej, w przeglądarce wpisz http://localhost:7474. Przy pierwszym logowaniu Neo4j poprosi o zmianę hasła na nowe (domyślny login/hasło: neo4j/neo4j). Po zmianie nastąpi przekierowanie na docelową stronę: http://localhost:7474/browser/
Domyślna, darmowa wersja, Neo4j posiada dwie bazy. Baza "system" to konfiguracja bazy danych. Baza "neo4j" to baza w której możesz przechowywać swoje dane. Możesz wyświetlić ich szczegóły wpisując komendę "show databases". W darmowej wersji Neo4j możesz mieć tylko jedną bazę; przy próbie utworzenia bazy danych otrzymasz błąd "Unsupported administration command: CREATE DATABASE xxx".
Twoją aktywną bazą jest zatem baza "neo4j". Nie musisz wybierać aktywnej bazy danych z którą będziesz pracować.
Tworzenie węzłów
Etykiety węzłów
Etykiety węzłów są stylizowane w 'CamelCase', gdzie pierwsza litera każdego słowa zaczyna się od dużej litery. Uwzględniana jest także wielkość liter. Oznacza to, że niezależnie od tego, jak je utworzysz w grafie, muszą one odpowiadać zapytaniom, które planujesz uruchomić później. Na przykład, jeśli podczas tworzenia etykiety w grafie użyjesz nieprawidłowej wielkości liter w 'CamelCase', będziesz musiał(a) napisać swoje zapytania z tą samą niepoprawną wielkością liter. Węzeł niepoprawny: 'Nazwa wezla'. Węzeł poprawny: 'NazwaWezla'.
Tworzymy węzeł
Przed tworzeniem węzłów wybieramy baze z którą będziemy pracować. Jak wyżej, naszą baza będzie "neo4j". Komendą ":use neo4j" wybieramy bazę danych. By utworzyć węzeł (node) w bazie używamy polecenia CREATE. Możemy utworzyć węzeł który nie ma żadnej etykiety, żadnych właściwości (poleceniem "CREATE (n)"). Taki węzeł byłby jednak dla nas zupełnie bezużyteczny - nie moglibyśmy się np. do niego odwołać tworząc relację z innymi węzłami czy precyzyjnie wyszukać. Tworzymy zatem węzeł, klienta, który będzie mieć etykietę i potrzebne właściwości:
CREATE (n:Klient {nazwisko_klienta: 'Jan Pertek', numer_klienta: 400230})
To odpowiednik polecnia SQL: "INSERT INTO table1 (nazwisko_klienta, numer_klienta) VALUES ("Jan Pertek", 400230)
Jeśli węzeł został poprawnie utworzony, otrzymamy w rezultacie komunikat podobny do tego: "Added 1 label, created 1 node, set 2 properties, completed after 17 ms." Sprawdźmy czy nasz węzeł został utworzony - wyświetlmy go:
MATCH (n)
RETURN
Polecenie "MATCH (n) RETURN n" to odpowiednik komendy SQL: "select * from table".
Potrzebujemy jeszcze produktu. Uwórzmy węzeł "Produkt" poleceniem:
CREATE (n:Produkt {nazwa_produktu: 'Piłka futbolowa', numer_produktu: 100})
W następnej częsci tutoriala utworzymy relacje między klientem i produktem.
Kontynuuj kurs przechodząc do następnego artykułu.