Update 2020-05-20: updates ivm installatie en algemene update voor de wijzigingen sinds de eerste versie van deze post uit begin 2018.
Of je een ervaren Neo4j ontwikkelaar of analyst bent, of net begonnen bent met het verkennen van Neo4j, één van de eerste hindernissen die je moet overwinnen is de tijd en moeite die het kost om je data in je Neo4j graphs te laden. Natuurlijk kan je CSV genereren en importeren, maar dat wordt al snel onoverzichtelijk en tijdrovend. We dachten dat dit beter kan.
Als grote fans van Kettle (of Pentaho Data Integration) en Neo4j besloten we deze beide werelden samen te brengen en ontwikkelden een Kettle plugin om data naar Neo4j te laden. Dat was in 2017, intussen is er veel gebeurd. Matt Casters, die Kettle startte, werkt intussen voor Neo4j en heeft de ontwikkeling van deze plugin overgenomen. Hij heeft aan aantal steps toegevoegd en heeft de plugin in het algemeen uitgebreid tot een tool die klaar is voor gebruik in productie. Laat ons dat in iets meer detail bekijken.
We gaan er van uit dat je vertrouwd bent met de installatie en het opstarten van zowel Neo4j als Kettle. Indien dat niet het geval is kan je hier terugvinden hoe je kan starten met Kettle, hier vind je hoe je met Neo4j van start kan gaan. Neem ook even een kijkje op ons overzicht rond graphs.
Om de Neo4j plugin aan je Kettle installatie toe te voegen kan je de laatste release downloaden (momenteel 5.0.4) uit onze GitHub repository en uitpakken in je data-integration/plugins folder. Vergeet niet eerste eventuele oudere versies te verwijderen en Spoon te (her)starten. Als alternatief voor deze manuele installatie kan je de Kettle Remix downloaden van remix.kettle.be. Kettle Remix is een door Matt samengestelde distributie die een groot aantal bug fixes en functionaliteit bevat die je niet in de standaard Kettle distributie vindt. De Neo4j plugin hoort bij deze extra functionaliteit.
2020-05-20: in de oorspronkelijke post en de toen beschikbare plugin-versie was 'Neo4j Output' de enige beschikbare step. Matt heeft sindsdien de plugin uitgebreid met een heel aantal extra steps en job entries die we daarom aan deze post toegevoegd hebben.
Na het opstarten van Spoon is een nieuwe categorie 'Neo4j' beschikbaar in je transformation editor:
De beschikbare transformation steps zijn:
De beschikbare job entries zijn:
Graphs zijn, net als Belgisch bier overal. We hebben daarom niet lang moeten zoeken naar een voorbeeld om met deze plugin uit te werken: we hebben de Beer Graph van Neo4j-held Rik Van Bruggen gerecupereerd om aan te tonen hoe eenvoudig het maken van nodes en relationships kan zijn. De code voor deze voorbeelden is hier beschikbaar.
Geef de details voor je Neo4j server op via Neo4j -> Edit Connection (Remix) of vanuit de 'connection' velden bovenaan in 1 van de Neo4j Output steps in de nodes transformations (zie hieronder). Om deze verbindingen te parametriseren kan je key/value velden toevoegen aan je kettle.properties, bijvoorbeeld:
NEO4J_HOST=localhost
NEO4J_USER=neo4j
NEO4J_PASS=knowbi
NEO4J_PORT=7687 # de BOLT protocol poort (standaard 7687), niet de browser poort (standaard 7474)
De job in het voorbeeld (jb_beer_graph.kjb) job bevat twee transformations:
tr_beer_nodes.ktr: lees het meegeleverde csv bestand, splits op voor alchohol, brewery, type, brand en maak de nodes aan.Om de nodes aan te maken biedt de Neo4j Output step de volgende opties:
In het onderstaande voorbeeld gebruiken we het BeerType veld om een label aan te maken en het 'name' veld voor het type beer als de 'name' property. Het 'Primary?' veld is ingesteld op 'Y' om aan te geven dat dit een primary propery is dat gebruikt zal worden om deze node op te zoeken bij het aanmaken van relaties.
De transformation om de relationships aan te maken is vergelijkbaar. In plaats van vier streams zoals voor de nodes, splitsen we hier het aangeleverde CSV in drie streams voor de relaties: beer - alcholpct, beer - brewery, beer - type, brand - beer.
Voor het aanmaken van relaties hebben we de drie tabs in de De Neo4j Output nodig.
Eerst geven we in de 'From Node' tab het label veld (brandLabel field) en primary property (BeerBrand) op
Het opzoeken van de end node is vergelijkbaar:
Tenslote bepalen we de relatie die deze beiden nodes verbindt in de Relationship tab:
In deze tab bepalen we het type relatie van uit een veld ('Relationship field') of met een tekst waarde ('Relationship value').
De bier graph wordt aangemaakt in twee verschillende transformations (eerst nodes, daarna relaties) om te vermijden dat nodes gedupliceerd worden. In het algemeen biedt het gescheiden aanmaken van nodes en relaties betere performantie.
Na het uitvoeren van de job kan je je graph verkennen in de Neo4J browser (e.g. http://localhost:7474).
Deze query toont je de node voor het heerlijke Orval. Indien je niet vertrouwd bent met de Cypher query taal kan je op de Orval node dubbel klikken. Je krijgt dan de verbonden nodes voor brewery, beer type en alcohol percentage te zien.
Meer informatie over de Neo4j plugin kan je vinden op de github wiki.
Update 2020-05-20: er is veel gebeurd sinds we de oorspronkelijk versie van de Kettle Neo4j plugin en deze post geschreven hebben. Eerst en vooral is Neo4j stevig gegroeid in de voorbije 2.5 jaar, net als de functionaliteit in de Kettle Neo4j plugin.
Aangezien we niet diezelfde groei zagen in Kettle (aka Pentaho Data Integration) zijn we gestart met Project Hop. Alle functionaliteit in de Kettle Neo4j plugins is reeds beschikbaar in Project Hop. Wat Project Hop is en hoe en waarom know.bi stevig betrokken is kan je in deze post lezen.
efficiently loading data to your Neo4j graphs to spend more time on data exploration, less on data preparation.