Kapitel 4. Laden von Knowledge-Graph-Daten

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

In Kapitel 3 hast du dich mit Graphdatenbanken und Abfragesprachen vertraut gemacht und sogar ein wenig über die Interna der Datenbank gelernt. Du hast auch gesehen, wie man Wissensgraphen abfragt und aktualisiert. Aber es gibt einen Sonderfall der Aktualisierung, der mehr Tiefe verdient: Massenimporte, die über den gesamten Lebenszyklus eines Wissensgraphen hinweg nützlich sind.

Tipp

Bei jeder der in diesem Kapitel beschriebenen Techniken ist es sinnvoll, klein anzufangen. Nimm einen kleinen, repräsentativen Ausschnitt deiner Daten und importiere ihn in die Datenbank. Überprüfe, ob das Modell wie gewünscht funktioniert, bevor du den gesamten Importauftrag ausführst. Eine schnelle Überprüfung kann dir Minuten oder Stunden an Frustration ersparen.

In diesem Kapitel lernst du drei Möglichkeiten kennen, wie du Daten in einen Wissensgraphen laden kannst. Du erfährst, wie du schrittweise Daten in einen Live-Wissensgraphen laden kannst und wie du einen Wissensgraphen mit großen Datenmengen bootstrappen kannst. Zunächst lernst du jedoch, wie du mit einem grafischen Tool die Struktur eines Wissensgraphen definierst und Daten für den Massenimport auf diese Struktur abbildest.

Daten mit dem Neo4j Data Importer laden

Du solltest mit dem einfachsten der drei beliebten Tools zum Laden von Neo4j-Massendaten beginnen. Der Neo4j Data Importer ist ein visuelles Tool, mit dem du dein Domänenmodell als Diagramm zeichnen und dann Daten über dieses Diagramm legen kannst, mit kommagetrennten Wertedateien (CSV), die die Daten für deine Knoten und Beziehungen enthalten.

Der Datenimporteur vereinfacht die Erstellung deines Wissensgraphen erheblich, besonders für Anfänger. Allerdings setzt er voraus, dass du deine Daten in CSV-Dateien zur Verfügung hast.

Um die Beispiele kurz zu halten, werden die Daten der sozialen Netzwerke verwendet, die du in den Kapiteln 1 und 3 kennengelernt hast. Bedenke, dass dieses einfache Beispiel funktioniert, aber echte Importe neigen dazu, viel größere Dateien zu verwenden!

Zeichne zunächst das soziale Netzwerk. Das Diagramm in Abbildung 4-1 zeigt das Domänenmodell, bestehend aus Person und Place Knoten und FRIEND und LIVES_IN Beziehungen.

bkgr 0401
Abbildung 4-1. Einrichten des Domänenmodells im Neo4j Data Importer

Füge zunächst deine CSV-Dateien wie in den Beispielen 4-1, 4-2, 4-3 und 4-4 hinzu, indem du im linken Bereich des Tools nach ihnen suchst. Zeichne die Knoten und Beziehungen, die das Domänenmodell bilden, mit den einfachen Zeichenwerkzeugen ein und beschrifte sie im rechten Bereich mit den Zuordnungsdetails.

Beispiel 4-1. people.csv Daten für Person Knotenpunkte im Neo4j Data Importer
:ID(Person),name
23,Rosa
42,Karl
55,Fred

In Beispiel 4-1 werden die ID des Knotens und seine Beschriftung als :ID(Person) mit einer einzigen Eigenschaft name angegeben. In den folgenden Zeilen siehst du Daten, die diesem Muster entsprechen, wie 23,Rosa. Beachte, dass die Spalte ID später verwendet wird, um den Graphen miteinander zu verbinden; sie ist nicht (notwendigerweise) Teil des Domänenmodells und kann zu einem späteren Zeitpunkt aus dem Modell entfernt werden.

Beispiel 4-2. friends.csv für FRIEND Beziehungen zwischen Person Knoten im Neo4j Data Importer
:START_ID(Person),:END_ID(Person)
23,42
42,23
42,55
55,42

In Beispiel 4-2 werden die Start- und End-IDs der Person Knoten mit :START_ID(Person),:END_ID(Person) angegeben. Du hast eine Beziehung, die von einem Person Knoten, der als ID dargestellt wird, zu einem anderen geht. In jeder Zeile siehst du die entsprechenden IDs der Start- und Endknoten einer FRIEND Beziehung, die mit den Daten in Beispiel 4-1 übereinstimmen.

Beispiel 4-3 folgt dem gleichen Muster wie Beispiel 4-1, aber für Place Knoten statt für Person Knoten. Der Header gibt an, dass es ein ID für Place Knoten gibt, gefolgt von city und country Eigenschaften, die auf jeden dieser Knoten geschrieben werden.

Beispiel 4-3. places.csv Daten für Place Knotenpunkte im Neo4j Data Importer
:ID(Place),city,country
143,Berlin,Germany
244,London,UK

Schließlich deklariert Beispiel 4-4 die LIVES_IN Beziehungen zwischen den Knoten Person und Place. Der Header gibt die ID des Knotens Person als Beginn der Beziehung an, die ID des Knotens Place als Ende der Beziehung und eine optionale Eigenschaft since für die Beziehung. Die CSV-Daten folgen dann diesem Muster.

Beispiel 4-4. lives_in.csv für LIVES_IN Beziehungen zwischen Person und Place Knoten im Neo4j Data Importer
:START_ID(Person),:END_ID(Place),since
23,143,2020
55,244
42,244,1980

Mit diesen CSV-Dateien kannst du nun den Neo4j Data Importer ausführen. Er wird gegen eine Live-Datenbank ausgeführt und benötigt daher einen Endpunkt und Anmeldedaten, um zu funktionieren. Sobald der Data Importer erfolgreich ausgeführt wurde, erhältst du einen Importbericht wie in Abbildung 4-2 dargestellt.

bkgr 0402
Abbildung 4-2. Der Datenimporteur ist fertig und du kannst die Cypher-Abfragen sehen, die er zum Laden der Daten in Neo4j verwendet hat

In Abbildung 4-2 siehst du einige der Cypher-Skripte, die gegen die Datenbank ausgeführt wurden, zusammen mit Statistiken über den Import. Eine Handvoll gängiger Cypher-Idiome hebt sich aus dem Bericht heraus: CREATE CONSTRAINT UNWIND und MERGE. Hier solltest du UNWIND verwenden, um Zeilen mit CSV-Daten in eine MERGE Operation einzugeben, die einen Person Knoten mit einer ID Eigenschaft erstellt. Dann wird mit SET eine since Eigenschaft auf diesen Knoten geschrieben. Wenn es für eine Zeile keine since Eigenschaft gibt, ist das kein Problem, denn SET toleriert das Fehlen von Daten für diese Beziehungen.

Tipp

UNWIND ist eine Cypher-Klausel, die eine Liste von Werten in Zeilen umwandelt, die in nachfolgende Anweisungen eingefügt werden. Sie ist eine sehr gebräuchliche Methode, um Eingabedaten zu verarbeiten, und du wirst sie in diesem Kapitel häufig sehen. Ihre übliche Form ist

UNWIND [1, 2, 3, null] AS x
RETURN x

wobei die Werte 1, 2, 3 und null als einzelne Zeilen an den Aufrufer zurückgegeben werden.

UNWIND wird erneut verwendet, um die Beziehungsdaten aus Beispiel 4-4 in das Diagramm einzugeben, wie in Abbildung 4-3 dargestellt.

bkgr 0403
Abbildung 4-3. Mischen von MERGE und MATCH mit Daten, die von UNWIND

In Abbildung 4-3 siehst du auch, wie eine Kombination aus MERGE und MATCH verwendet wird. Erinnere dich daran, dass du in Kapitel 3 MERGE verwendet hast, wenn nicht klar war, ob ein Knoten oder eine Beziehung existiert oder nicht, denn MERGE verhält sich wie MATCH, wenn ein Datensatz existiert, und wie CREATE, wenn er nicht existiert. Hier brauchst du nicht MERGE für die Knoten Person und Place, weil sie in der CSV-Eingabedatei garantiert vorhanden sind. Stattdessen musst du nur MERGE die Beziehung LIVES_IN zwischen diesen vorhandenen Knoten angeben, wobei MERGE sicherstellt, dass es keine doppelten Beziehungen gibt.

Natürlich könntest du den entsprechenden Cypher auch von Hand schreiben und als Skript ausführen, um den gleichen Effekt zu erzielen (wie im folgenden Abschnitt "Online Bulk Data Loading mit LOAD CSV"). Du könntest diesen Cypher auch als automatisch generierten Quellcode verwenden, der verändert und in der Versionskontrolle gehostet werden kann, damit er mit der Zeit weiterentwickelt werden kann, wenn der Wissensgraph wächst.

Der Neo4j Data Importer verschafft dir einen Vorsprung, nicht nur mit dem Cypher-Code für den Import, sondern auch durch das Visualisieren, Überprüfen und Debuggen des Modells und der Daten, die in das Modell einfließen werden , bevor du mit dem Import beginnst. Daher ist er sowohl für erfahrene Neo4j-Entwickler als auch für Neulinge im Bereich der Graphdatenbanken nützlich.

Online Bulk Data Loading mit LOAD CSV

In Kapitel 3 hast du gesehen, wie du mit den Cypher-Befehlen CREATE und MERGE Datensätze in der Datenbank erstellst (und aktualisierst). In "Laden von Daten mit dem Neo4j Data Importer" hast du gelernt, wie ein visuelles Tool Cypher-Code erzeugt, der dann CSV-Daten in eine Live-Datenbank lädt.

Es gibt aber noch eine andere Möglichkeit, CSV-Importe zu skripten: mit dem Befehl LOAD CSV von Cypher.LOAD CSV ermöglicht es dir, CSV-Daten von verschiedenen Orten aus in ein Online-Diagramm zu importieren. Du kannst CSV-Daten über Webadressen (wie Amazon S3-Buckets oder Google Sheets) und Dateisysteme laden, und LOAD CSV Importe erfolgen, während die Datenbank live ist und andere Abfragen bedient. Nützlicherweise können CSV-Dateien auch komprimiert werden, was bei der Übertragung großer Datenmengen hilfreich ist.

LOAD CSV wird am einfachsten anhand eines Beispiels erklärt. Lade zunächst alle Place Knoten aus dem sozialen Netzwerk mit LOAD CSV. Die verwendete CSV-Datei findest du in Beispiel 4-5.

Beispiel 4-5. CSV-Daten für Place Knotenpunkte
city,country
Berlin,Germany
London,UK

Da die Ortsdaten einheitlich sind, kannst du ein einfaches LOAD CSV Muster verwenden, um die Knoten in den Wissensgraphen einzufügen, wie in Beispiel 4-6 gezeigt.

Beispiel 4-6. Einfaches LOAD CSV für Place Knoten
LOAD CSV WITH HEADERS FROM 'places.csv' AS line
MERGE (:Place {country: line.country, city: line.city})

Beispiel 4-6 ist zwar keine vollständige Lösung für das Laden des Wissensgraphen (da nur Stellen geladen werden), aber es veranschaulicht das grundlegende Muster für die Verwendung von LOAD CSV. Die erste Zeile setzt sich wie folgt zusammen:

  • LOAD CSV ist der Cypher-Befehl, den du ausführen willst.

  • WITH HEADERS weist den Befehl an, Kopfzeilendefinitionen in der ersten Zeile der CSV-Datei zu erwarten. Obwohl Kopfzeilen optional sind, ist es in der Regel eine gute Idee, sie zu verwenden. Mit Hilfe von Kopfzeilen kannst du auf Spalten mit einem freundlichen Namen verweisen (statt nur mit einem numerischen Index), wie in der Anweisung MERGE in Beispiel 4-6 gezeigt.

  • FROM 'places.csv' teilt dem Befehl mit, wo die CSV-Daten zu finden sind. Beachte, dass die Neo4j-Sicherheitsberechtigungen möglicherweise geändert werden müssen, wenn du von nicht standardmäßigen Speicherorten im Dateisystem oder von entfernten Servern importieren willst.

  • AS line bindet jede Zeile in der CSV-Datei an eine Variable in Cypher namens line, auf die später in der Abfrage zugegriffen werden kann.

Die Daten über Personen sind viel unregelmäßiger. Das Einzige, was du von allen Personen weißt, ist ihr Name. Von einigen Personen kennst du vielleicht auch ihr Geschlecht oder Alter, wie in Beispiel 4-7 gezeigt.

Beispiel 4-7. CSV-Daten für Person Knotenpunkte
name,gender,age
Rosa,f,
Karl,,64
Fred,,

Wenn du unregelmäßige Daten hast (wie in der realen Welt), musst du einen etwas ausgefeilteren LOAD CSV Ansatz wählen. Du musst das Skript so ändern, dass es wie in Beispiel 4-8 aussieht. Hier kannst du SET verwenden, um zu verhindern, dass Nulleigenschaften in den Knoten geschrieben werden, was dazu führen würde, dass die Operation fehlschlägt. Wenn du versuchst, den einfacheren Ansatz aus Beispiel 4-6 zu verwenden, wird die Abfrage fehlschlagen und sich über null Eigenschaftswerte beschweren.

Beispiel 4-8. Anspruchsvollere LOAD CSV für unregelmäßige Person Knoten
LOAD CSV WITH HEADERS FROM 'people.csv' AS line
MERGE (p:Person {name: line.name})
SET p.age = line.age
SET p.gender = line.gender

Schließlich kannst du die Beziehungen LIVES_IN und FRIEND hinzufügen, um die neuen Knoten in einem Wissensgraphen zu verknüpfen (oder sie mit bestehenden Knoten zu verbinden, wenn du bereits einen Wissensgraphen hast). In Beispiel 4-9 sind die Beziehungen FRIEND in CSV kodiert, so dass es zum Beispiel eine Beziehung FRIEND von Rosa zu Karl und eine weitere von Karl zu Fred gibt.

Beispiel 4-9. FRIEND Beziehungen im CSV-Format
from,to
Rosa,Karl
Karl,Rosa
Karl,Fred
Fred,Karl
Tipp

Da es sich um ein kleines Beispiel handelt, sind die Namen der Personen eindeutig genug, um als IDs zu fungieren. Bei einem echten Import ist dies wahrscheinlich nicht der Fall, und es ist sinnvoll, eindeutige numerische IDs für die Knoten einzuführen. In der Praxis würde dies bedeuten, dass für jede Zeile in den CSV-Dateien der Personen und Orte eine aufsteigende ganzzahlige ID hinzugefügt wird.

Du kannst diese Daten verwenden, um FRIEND Beziehungen zu erstellen (wenn sie noch nicht existieren), wie in Beispiel 4-10 gezeigt. Da du weißt, dass die Person Knoten in Beispiel 4-9 bereits ausgefüllt wurden, kannst du sie einfach MATCH und alle Beziehungen zwischen ihnen mit MERGE in Beispiel 4-10 ausfüllen.

Beispiel 4-10. Laden von FRIEND Beziehungen
LOAD CSV WITH HEADERS FROM "friend_rels.csv" AS line
MATCH (p1:Person {name:line.from}), (p2:Person {name:line.to})
MERGE (p1)-[:FRIEND]->(p2)

Die LIVES_IN Beziehungen sind etwas komplizierter, da sie optional since Eigenschaften haben. In Beispiel 4-11 hat die Zeile Fred,London,, ein nachgestelltes Doppelkomma, was bedeutet, dass das Feld since keinen Wert enthält. In dieser Situation ist Vorsicht geboten.

Beispiel 4-11. LIVES_IN Beziehungen im CSV-Format
from,to,since
Rosa,Berlin,2020
Fred,London,,
Karl,London,1980

Um die Daten aus Beispiel 4-11 zu laden, verwendest du den Cypher-Code in Beispiel 4-12. Beachte, dass du nicht MERGE (person)-[:LIVES_IN {since:line.since}]->(place) verwendest, um den Wert der Eigenschaft since zu setzen, da dies in den Zeilen, in denen die Eigenschaft fehlt, fehlschlagen würde. Auch hier solltest du SET verwenden , nachdem der Beziehungsdatensatz erstellt wurde, um die Eigenschaft hinzuzufügen. Das ist völlig in Ordnung, da die Anweisung transaktional ausgeführt wird, so dass die Beziehung und ihre Eigenschaft atomar geschrieben werden, obwohl sie syntaktisch getrennt sind.

Beispiel 4-12. Laden von FRIEND Beziehungen mit Eigenschaftsdaten
LOAD CSV WITH HEADERS FROM "friend_rels.csv" AS line
MATCH (person:Person {name:line.from}), (place:Place {city:line.to})
MERGE (person)-[r:LIVES_IN]->(place)
SET r.since=line.since

Bei sehr großen Datenimporten, z.B. ab einer Million Datensätze, ist es oft sinnvoll, den Vorgang in kleinere Batches aufzuteilen. So wird sichergestellt, dass die Datenbank nicht mit großen Einfügungen überlastet wird und die anderen Abfragen des Wissensgraphen reibungslos laufen. Vor Neo4j 4.4 wurde zu diesem Zweck die Funktion apoc.periodic.iterate aus der APOC-Bibliothek verwendet. Ab Neo4j 4.4 steht eine ähnliche Funktion direkt in Cypher unter CALL {...} IN TRANSACTIONS OF ... ROWS zur Verfügung. Mit dieser Methode kannst du das Laden von Person Knoten in kleinere Batches aufteilen, wie in Beispiel 4-13 gezeigt. In einem realen System wären sowohl die Anzahl der Zeilen als auch die Anzahl der Batches natürlich viel höher.

Beispiel 4-13. Laden von People Knoten in Stapeln (Präfix mit :auto, wenn aus dem Neo4j-Browser ausgeführt)
LOAD CSV WITH HEADERS FROM 'people.csv' AS line
CALL {
  WITH line
  MERGE (p:Person {name: line.name})
  SET p.age = line.age
  SET p.gender = line.gender
} IN TRANSACTIONS OF 1 ROWS

Einer der Vorteile von LOAD CSV ist, dass es sich um ein reguläres Cypher-Programm handelt. Du kannst also alles, was du über Cypher gelernt hast, nutzen, einschließlich EXPLAIN und PROFILE, um die Bulk-Ingestion zu analysieren, zu debuggen und zu optimieren. Der einfache Abfrageplan für das Laden von FRIEND -Relationen ist zum Beispiel in Abbildung 4-4 dargestellt.

bkgr 0404
Abbildung 4-4. Visualisierung des Abfrageplans für eine LOAD CSV Operation

Abbildung 4-4 sieht insgesamt gut aus. Sogar der kartesische Produktoperator (vor dem dich der Neo4j-Browser warnt) ist kein Problem , weil er von einem Filter gespeist wird, der seine Eingaben auf nur zwei übereinstimmende Knoten und die entsprechende CSV-Zeile reduziert. Natürlich ist das nicht immer der Fall, und die Verwendung von EXPLAIN oder PROFILE für eine kleine Menge repräsentativer Eingabedaten kann helfen, Leistungsprobleme zu lösen, bevor sie entstehen.

Tipp

Achte nicht nur auf kartesische Produkte, sondern auch auf alle eager Operatoren im Abfrageplan oder -profil. Eifrige Operatoren ziehen sofort alle Daten ein und bilden oft einen Drosselungspunkt. Mark Needham hat einen ausgezeichneten Blogbeitrag über Strategien zum Entfernen von eifrigen Operatoren.

LOAD CSV ist schnell und kann jederzeit während des Lebenszyklus deines Wissensgraphen verwendet werden. Die Datenbank bleibt während der Aktualisierungen online, damit sie andere Abfragen bearbeiten kann. Es kann jedoch eine gewisse Abstimmung erfordern, um einen guten Durchsatz zu erreichen, ohne die regulären Datenbankoperationen zu dominieren. Aber LOAD CSV ist nicht die letzte Option für Masseneinfügungen - du hast noch eine weitere, die du zu deinem Toolkit hinzufügen kannst.

Anfängliche Schüttgutladung

Oft gibt es einen ersten Import, bei dem den Wissensgraphen mit potenziell großen Datenmengen auffüllt. Dafür kann der Neo4j Data Importer oder LOAD CSV verwendet werden, aber es gibt auch einen schnelleren Weg, wenn auch einen, der etwas weniger anspruchsvoll ist.

Das Neo4j-Kommandozeilentool neo4j-admin hat mit einen Offline-Importer integriert. Der Befehl neo4j-admin import erstellt eine neue Neo4j-Datenbank aus einer Reihe von CSV-Dateien. (Eine ausführliche Anleitung findest du unter neo4j-admin import.)

Das Tool neo4j-admin nimmt Daten sehr schnell auf, mit einer anhaltenden Leistung von etwa einer Million Datensätzen pro Sekunde, und verfügt über Optimierungen für Geräte mit hohem Durchsatz wie SSDs und SANs (Storage Area Networks). Es ist eine leistungsstarke Methode für den Aufbau von Massenimporten in deinen Wissensgraphen - mit dem Vorbehalt, dass die Datenbank bei jeder Ausführung offline sein muss.1

Warnung

Der Nachteil von neo4j-admin import ist, dass es sich um einen Offline-Importer handelt, der deshalb so schnell ist. Sobald der Import abgeschlossen ist, steht die Datenbank für Knowledge-Graph-Abfragen bereit, ist aber während des Aufbaus nicht verfügbar.

Um neo4j-admin import zu nutzen, musst du deine Daten zunächst in CSV-Dateien zusammenstellen und sie auf einem Dateisystem ablegen, auf das der Importer zugreifen kann. Das Dateisystem muss nicht unbedingt lokal sein - es kann auch ein Netzwerkmount sein. Es muss aber ein Dateisystem sein, da neo4j-admin import keine Daten aus S3-Buckets oder anderen Datenspeichern lesen kann, die keine Dateisysteme sind. Da die Datenmengen groß sein können, unterstützt das Tool auch komprimierte (gzipped) CSV-Dateien.

Der Importer erwartet zumindest, dass die CSV-Dateien als separate Dateien für Knoten und Beziehungen vorliegen. Es ist jedoch eine gute Praxis, separate CSV-Dateien für verschiedene Arten von Knoten und Beziehungen zu haben, z.B. die Aufteilung von Person und Place Knoten und FRIEND und LIVES_IN Beziehungen.

Sehr große Dateien sollten in mehrere kleinere CSV-Dateien aufgeteilt werden, wobei der CSV-Header selbst in einer separaten Datei gespeichert wird. Das macht die Textbearbeitung großer Dateien viel weniger mühsam, da kleinere Dateien für die Textbearbeitung besser geeignet sind.

Tipp

Du musst nicht sicherstellen, dass die CSV-Dateien perfekt sind, sie müssen nur gut genug sein. Der Importer toleriert unterschiedliche Trennzeichen, ignoriert zusätzliche Spalten, überspringt Duplikate und schlechte Beziehungen und schneidet sogar Zeichenketten für dich zurecht. Trotzdem musst du sicherstellen, dass es keine Sonderzeichen, fehlende Anführungszeichen, nicht sichtbare Byte-Order-Markierungen und Ähnliches gibt, die den Importer beeinträchtigen können.

Beginne damit, deine CSV-Dateien vorzubereiten.Beispiel 4-14 ist eine typische, in sich geschlossene CSV-Datei. Sie hat eine Kopfzeile, die die Namen der Spalten und dann die Datenzeilen definiert. Die Kopfzeile :ID(Person) besagt, dass die Spalte die ID eines Knotens darstellt und der Knoten die Bezeichnung Person hat. Wie beim Neo4j Data Importer ist die ID nicht unbedingt Teil des Domänenmodells, sondern wird vom Tool verwendet, um Knoten miteinander zu verknüpfen. Die Kopfzeile name besagt, dass die zweite Spalte eine Eigenschaft namens name ist, die in den aktuellen Knoten geschrieben wird.

Beispiel 4-14. people.csv enthält eindeutige IDs für Person Knoten und eine name Eigenschaft für jeden.
:ID(Person),name
23,Rosa
42,Karl
55,Fred

Beispiel 4-14 ist zwar in sich abgeschlossen, aber bei größeren Importen ist es praktischer, die Dinge zu trennen. Für FRIEND Beziehungen zwischen Person Knoten kannst du die CSV-Dateien beispielsweise in eine Header-Datei, die die Daten beschreibt, und mehrere (typischerweise große) Datendateien aufteilen, wie in den Beispielen 4-15, 4-16 und 4-17 gezeigt.

Beispiel 4-15. friends_header.csv enthält die Signatur für Beziehungsdaten für das Muster (:Per⁠son)​-[:FRIEND]→(:Person)
:START_ID(Person),:END_ID(Person)
Beispiel 4-16. friends1.csv enthält den ersten Satz von Beziehungsdaten für (:Person)-[:FRIEND]->(:Person) Muster
23,42
42,23
Beispiel 4-17. friends2.csv enthält den zweiten Satz von Beziehungsdaten für das Muster (:Per⁠son)-[:FRIEND]→(:Person)
42,55
55,42

Der Importer behandelt die Beispiele 4-15, 4-16 und 4-17 logisch als eine Einheit, unabhängig davon, wie viele Dateien es letztendlich gibt. Du kannst die gleiche Trennung sowohl für Knoten als auch für Beziehungen verwenden.Beispiel 4-18 deklariert einen CSV-Header für Place Knoten, die ein Place Label und die Eigenschaften ID, city und country haben. Die Beispiele 4-19 und 4-20 enthalten die Daten, die gemäß dem Header formatiert sind.

Beispiel 4-18. places_header.csv enthält die Signatur für Place Knoten
:ID(Place), city, country
Beispiel 4-19. places1.csv enthält Daten für Place Knoten
143,Berlin,Germany
Beispiel 4-20. places2.csv enthält Daten für Place Knoten
244,London,UK

Um Personen und Orte miteinander zu verbinden, brauchst du etwas wie in Beispiel 4-21, das Beziehungen enthält, die mit den Knoten Person beginnen und mit den Knoten Place enden. Einige, aber nicht alle dieser Beziehungen haben auch die Eigenschaft since, die das Datum angibt, seit wann die Person an dem Ort lebt. Die Eigenschaft since stammt, falls vorhanden, aus der dritten Spalte der CSV-Datei.

Beispiel 4-21. people_places.csv enthält Daten für LIVES_IN Beziehungen und eine optionale since Eigenschaft
:START_ID(Person),:END_ID(Place),since
23,143,2020
55,244
42,244,1980

Wenn die CSV-Daten korrekt sind und keine überflüssigen Zeichen oder Beziehungen enthalten, kannst du den Importer über die Daten laufen lassen, um den Wissensgraphen zu erstellen.Beispiel 4-22 zeigt ein Befehlszeilenbeispiel, mit dem du Daten aus den CSV-Dateien in einen Wissensgraphen einfügst. Beachte, dass es sich um einen mehrzeiligen Befehl handelt, also achte darauf, dass die \ Zeichen am Ende jeder Zeile stehen.

Beispiel 4-22. ausführen neo4j-admin import
bin/neo4j-admin import --nodes=Person=import/people.csv \
--relationships=FRIEND=import/friends_header.csv,import/friends1.csv,\
    import/friends2.csv \
--nodes=Place=import/places_header.csv,import/places1.csv,import/places2.csv \
--relationships=LIVES_IN=import/people_places.csv

Das Tool neo4j-admin import ist sehr schnell und eignet sich für sehr große Datensätze (mit vielen Milliarden Datensätzen), mit einem anhaltenden Durchsatz von etwa einer Million Datensätzen pro Sekunde. Bedenke, dass große Importe viel Arbeitsspeicher benötigen und die Ausführung Stunden dauern kann. Das Tool kann nicht fortgesetzt werden, also achte darauf, dass du nicht Ctrl-c in das Terminalfenster eingibst, während es läuft. Andernfalls musst du aufrufen, um den Import von vorne zu beginnen, was bei lang laufenden Aufgaben schmerzhaft ist.

Zusammenfassung

Zu diesem Zeitpunkt solltest du mit den Konzepten von Online- und Offline-Massenimporten vertraut sein. Du hast gesehen, wie jede dieser Techniken funktioniert und ihre Vor- und Nachteile abgewogen. Du solltest auch in der Lage sein, eine vernünftige Entscheidung darüber zu treffen, welche dieser Methoden für den Wissensgraphen, den du aufbaust, geeignet ist, einschließlich der Möglichkeit, während des Lebenszyklus des Wissensgraphen mehrere Tools zu verwenden.

Von hier aus gehst du weiter nach oben und erkundest, wie Daten in den Wissensgraphen gestreamt werden können, um ihn ständig auf dem neuesten Stand zu halten und eine weitere Verarbeitung anzustoßen.

1 Vor Neo4j 5 konnte neo4j-admin import nur verwendet werden, um einen ersten Wissensgraphen für das System zu erstellen. Diese Einschränkung wurde später gelockert, um mehrere Offline-Importe während des gesamten Lebenszyklus des Systems zu ermöglichen.

Get Wissensgraphen aufbauen now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.