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.
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.
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.
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 AnweisungMERGE
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 namensline
, 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.
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 (:Person)-[: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 (:Person)-[: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.