Neo4j är en NoSQL-databas eller närmare bestämt en grafdatabas. Det är en javabaserad open source-produkt och utvecklarna bakom Neo4j beskriver den så här:

Embedded, disk-based, fully transactional Java persistence engine that stores data structured in graphs rather than in tables

Detta inlägg beskriver kort några av de features som Neo4j erbjuder och en kortare introduktion till frågespråket Cypher som används för att hitta rätt i grafen.

Features

  • Den kan köras embedded eller som en separat serverprocess
  • Den har stöd för de vanligaste programmeringsspråken
  • REST-API
  • HA-stöd (High Availability)
  • Den är svinsnabb
  • Transaktionsstöd (ACID)
  • Den har samma licenstyp som MySQL och MongoDB
  • Index-stöd via Lucene eller annan pluggbar teknologi
  • Enklare stöd för constraints (UNIQUE)

Bilden nedan illustrerar detta (i form av en graf såklart):

neo4j

Graf?

Vad är då en graf? Jo, en graf är ett gäng noder som sitter ihop med hjälp av relationer. Både noder och relationer kan ha egenskaper (properties). Så pass enkelt är det faktiskt.

What is a graph?

När du använder en grafdatabas så är det en fröjd att jobba fram en domänmodell (tänk DDD-on-steroids). Man kan förenklat säga att det mesta som du kan modellera på en whiteboard går att realisera i en grafdatabas.

Ett exempel på en graf är taget från ett av de projekt där jag deltagit. Projektet heter Bandtrace och presenterar artister, releaser och låtar. Dessutom visas mängder av relationer mellan dessa entiteter. Bilden visar hur Dave Grohl och Kurt Cobain båda är medlemmar i Nirvana. Dave är dessutom medlem Foo Fighters och Queens of the Stone Age (Q.O.T.S.A.). Dave, Kurt, Nirvana, Foo Fighters och Q.O.T.S.A. är alla noder i grafen och sitter ihop via relationer av typen MEMBER_OF. Smidigt, inte sant?

model

Hitta rätt i grafen

För att jobba med grafen används ett frågespråk som heter Cypher. Syntaxen är enkel att lära sig och språket använder en hel del låneord från bland annat SQL för att användaren ska känna igen sig.

Cypher använder “mönster” för att beskriva hur noder hänger ihop. Dessa mönster kan liknas vid ASCII-art (jag vet att det hela låter som ett skämt men det är faktiskt sant).

Så, tänk dig följande noder:
nodes

Det uttrycks på följande sätt i Cypher (i klassisk ASCII-anda):
nodes-ascii

Om noderna är namngivna (A och B) enligt följande:
named-nodes

Så ser Cypher-uttrycket ut så här:
named-nodes-ascii

Om dessutom relationen mellan noderna har ett namn (MEMBER_OF):
named-rels

Så ser det hela ut så här:
named-rels-ascii

Labba med Neo4j – GraphGists

GraphGists är ett smidigt sätt att labba med Neo4j. Du behöver inte installera någon Neo4j-instans utan kan helt enkelt bara köra Cypher-statements direkt på en webbsida. Sjukt smidigt!

Så, åter till Kurt och Dave. Jag har skapat en GraphGist som beskriver begreppet Connected Artists m.h.a. Cypher. En “Connected Artist” är en artist som ligger två nivåer bort. I exemplet ovan har Nirvana två band som är just “Connected Artists” nämligen banden Foo Fighters och Q.O.T.S.A – dessa är “Connected” via medlemmen Dave Grohl. Jag hoppas att exemplet är hyfsat självförklarande men om ni har några frågor är det bara att skicka ett mejl.