Problemdefinition
Knowledge Graph-Entitäten (auch bekannt als Knoten) sind durch Beziehungen verbunden; Entitäts-ESRI__ID-Werte sind Fremdschlüssel in den Beziehungsspalten ESRI__OriginID und ESRI__DestID. Die ID-Werte stammen vom Datentyp GlobalID und werden systemseitig generiert. Da ESRI__ID-Werte auf Entitäten existieren müssen, bevor sie in Beziehungen verwendet werden können, denken viele, dass man einen Graphen in zwei Schritten erstellen oder pflegen muss – zuerst die Entitäten und dann separat die Beziehungen – und sie enden damit, zwei ETL Tools zu verwalten oder mehr, wenn die Verarbeitung für jede Kombination von Entität und Beziehung erfolgt. Das ist unnötig.
Dieser Blog zeigt, wie Sie einen Graphen mit nur einem ETL Tool pflegen können, das sowohl Entitäten als auch Beziehungen in einem Durchlauf schreibt.
Graph-Szenario
Zunächst sehen Sie die obligatorische – und sehr volle – Karte! Das heutige Graph-Thema sind weltweite Flughafen- und Flugdaten für 24 Stunden vor und nach der Ausführungszeit des ETL Tools, also etwa die Hälfte der Flüge liegt in der Vergangenheit und die andere Hälfte ist für die nahe Zukunft geplant. Beachten Sie, dass die Flugrouten keine tatsächlichen Flugzeugrouten modellieren, der Graph soll nur die Konnektivität abbilden. Mehr zu Anwendungsfall-Szenarien weiter unten.
Weltweite Flughäfen und Flüge
Das ETL Tool
Die Daten werden von FlightAware über deren AeroAPI-Endpunkte bereitgestellt, auf die dieses ETL Tool zugreift – verfügbar im Blog-Download. Sie benötigen Ihren eigenen API-Schlüssel.
Einmaliger Durchlauf ETL Tool zur Graph-Pflege
Auch wenn Sie keinen AeroAPI-Zugang haben, laden Sie den Blog-Anhang herunter, entpacken ihn und installieren den Inhalt wie folgt (erfordert ArcGIS Data Interoperability für Pro 3.5+):
- Create.fmw – legen Sie diese Workspace-Quelldatei in einem Pro-Projekt-Stammordner ab
- Optional können Sie ein ETL Tool erstellen, das das fmw als Quelle verwendet
- LoopingAirportsGetter.fmx – ein benutzerdefinierter Transformer, der von Create.fmw verwendet wird
- Legen Sie diesen in Ihrem Benutzerprofilordner C:\Users\<IhrBenutzername>\Documents\FME\Transformers ab
Es gibt viel nützliches Material, das wir in den Tools behandeln werden, aber um sofort zum Hauptziel des Blogs zu kommen – wie man Entitäten und Beziehungen in einem Workspace schreibt – sehen Sie in Create.fmw, dass Sie zuerst Entitäten mit einem FeatureWriter-Transformer in den Graph schreiben, dann den Summary-Ausgangsport des FeatureWriter verwenden, um das Einlesen der Entitäten mit einem FeatureReader-Transformer auszulösen – diese haben dann die benötigten ESRI__ID-Werte. Der Workspace ist nicht kompakt angeordnet, um diese Sequenz zu zeigen, aber suchen Sie nach dem Transformer namens FeatureWriter, der Flughäfen schreibt, und Sie sehen eine direkte Verbindung vom Summary-Port zum Transformer namens FeatureReader, der gerade geschriebene Flughäfen liest. Summary-Ports geben nach Abschluss der Schreibtransaktion ein einzelnes nicht-räumliches Feature mit einigen identifizierenden und statistischen Eigenschaften aus.
Beziehungen zu schreiben kann mit gewöhnlichen Esri Knowledge Graph-Schreibern erfolgen, da sie keine nachgelagerte Abhängigkeit haben. Wenn das alles ist, wofür Sie heute gekommen sind, brauchen Sie nicht weiterzulesen. Aber wenn Sie tiefere Einblicke in ETL mögen, werden Sie wahrscheinlich im Rest des Beitrags etwas lernen – also lesen Sie weiter!
Ich erstelle einen Graphen mit Daten aus einer API, die modernen Standards folgt – REST-Aufrufe liefern paginierte JSON-Antworten zurück und die gesamte API hat eine OpenAPI-Spezifikation. Sie können die API unter dieser URL inspizieren und den Link zur OpenAPI-Spezifikation bemerken.
Da die OpenAPI-Spezifikation verfügbar ist, kann sie in einen OpenAPICaller-Transformer importiert werden, der die Konstruktion von HTTP-Aufrufen zu einer Formularausfüllübung macht. Hier ist der erste OpenAPICaller im Workspace. Beachten Sie, dass ich 100 Seiten (1500 Datensätze) Flughafendaten anfordere und der Header einen Toolparameter für den API-Schlüssel sowie eine Anforderung für eine JSON-Antwort enthält. Das Flughafenschema ist nicht sehr breit, daher überlasten 1500 Datensätze nicht die HTTP GET-Antwort und verursachen keine Fehler. Ich erhalte jedoch nur einen ersten Datensatzsatz, nicht alle Flughafendaten.
OpenAPICaller für Flughäfen
Die API unterstützt Paginierung. Wenn eine Anfrage nicht die letzten verfügbaren Datensätze auf dem Server zurückgibt, ist im Antwortobjekt ein JSON-Objekt namens next (eine URL) vorhanden. Wird diese als Anfrage gesendet, liefert sie den nächsten Satz Seiten zurück. Dies eignet sich für eine Schleife zum Abrufen aller Daten, was der benutzerdefinierte Transformer LoopingAirportsGetter macht.
LoopingAirportsGetter
Da die nächste URL für uns aufgebaut wird, können wir im benutzerdefinierten Transformer einen einfachen HTTPCaller verwenden und nicht noch einen OpenAPICaller. Nun haben wir alle Flughafendaten und können den Entitätstyp schreiben.
Wenn Sie das Tool inspizieren, sehen Sie, dass nachdem die Flughafenentitäten in den Graph geschrieben wurden, diese mit ESRI__ID-Werten wieder ausgelesen werden und ein weiterer OpenAPICaller Flüge für jeden Flughafen abruft. Dieses Mal werden pro Aufruf 50 Seiten Daten abgerufen (das Schema ist breiter), aber wir können gleichzeitig 25 Aufrufe durchführen, da wir nicht durch einen großen Cursor auf der Backend-Seite blättern, sondern durch die Flüge jedes einzelnen Flughafens.
OpenAPICaller für Flüge
Es gibt weltweit einige wenige Flughäfen mit mehr als 50 Seiten Flügen (750 Datensätze) über 48 Stunden hinweg. Diese werden mit einem HTTPCaller abgerufen, falls next ist nicht null bei einer anfänglichen Anfrage.<\/P>
Beachten Sie die start<\/STRONG> und end<\/STRONG> Abfrageparameter. Dies sind UTC-Zeitstempel im ISO-Format, die beim Start des Tools durch skriptgesteuerte Parameter generiert werden - also hat sich etwas Code in mein ETL-Tool eingeschlichen! Dies könnte mit transformers gemacht werden.<\/P>Der Graph in ArcGIS<\/H4> <\/P>Ich lasse Sie das Tool durchsuchen, um die Logik der Entitäts- und Beziehungsstruktur zu untersuchen, aber im Grunde sind die Entitätstypen Airports<\/STRONG> (Punkte) und Flights<\/STRONG> (2-Punkt-Linien) und die Beziehungen sind, dass Flughäfen Abflüge auf Flügen haben (HasDeparture<\/STRONG>), Flüge Verbindungen zu anderen Flügen haben können (HasConnection<\/STRONG>) und Flüge Ankünfte an Flughäfen haben (HasArrival<\/STRONG>). Die Geschäftslogik für Verbindungen besagt, dass Flüge verbunden sind, wenn ein ankommender Flug zwischen 1 und 4 Stunden vor dem Abflug des abgehenden Fluges landet. Im wirklichen Leben könnten andere Faktoren wie abgestimmte Code-Shares eine Rolle spielen, aber dies ist nur eine Demo!<\/P>Hier ist die Ansicht des Graph-Datenmodells, Flughäfen und Flüge haben Beziehungen zueinander und Flüge haben Verbindungen mit anderen Flügen. Die Entität Document wird nicht verwendet.<\/P>
FlightAware Graph Data Model<\/span><\/span><\/P>Jetzt machen wir eine analytische Abfrage! Angenommen, ich bin ein Strafverfolgungsbeamter und möchte Fluggesellschaften und Flughäfen bitten, Passagierlisten und kürzliches Videomaterial nach einem mutmaßlichen Juwelendieb zu durchsuchen, von dem ich denke, dass er Los Angeles verlassen hat, um nach Berlin zu reisen, oder kurz davor steht. Welche Fluggesellschaften, Flüge und Flughäfen sind am sinnvollsten für eine Anfrage? Natürlich hole ich meine openCypher<\/A>-Kenntnisse hervor und nutze meinen täglich aktualisierten Graph!<\/P>Ich lasse Sie den Code durchgehen, aber was er tut, ist den Pfad mit der kürzesten Flugzeit zwischen Los Angeles und Berlin-Brandenberg zu finden, mit maximal 4 Flugabschnitten.<\/P>
match path = (origin:Airports)-[:HasDeparture|:HasConnection*0..3]->(:Flights)-[:HasArrival]->(destination:Airports)\nwhere origin.name = 'Los Angeles Intl' AND destination.name = 'Berlin-Brandenburg'\nwith path, nodes(path) as flights\nunwind flights as flight\nwith path, sum(case when flight:Flights then flight.filed_ete else 0 end) as totalDuration\nreturn path, (totalDuration\/3600) as totalDuration\norder by totalDuration\nlimit 1<\/code><\/pre> Ein Pfad wird von meiner Abfrage zurückgegeben....<\/P>
Diskussion<\/H4> <\/P>Dies demonstriert sowohl den Single-Tool-Ansatz als auch vieles mehr rund um die Nutzung von API-Daten und Knowledge Graphs.<\/STRONG> Der ETL-Arbeitsbereich im Download ist in einem einsatzbereiten Zustand, vorausgesetzt Sie haben einen API-Schlüssel und haben den Graph bereits zuvor aufgebaut - er ist aktualisiert. Das Tool kann mit der regulären Tool-Planungsfunktion von ArcGIS Pro ausgeführt werden, zum Beispiel täglich. Sie werden nicht von Anfang an in diesem Zustand sein, aber Sie sehen einige Creator transformers, die verwendet werden können, um das Tool manuell in Teilen auszuführen, zum Beispiel um die Airports-Entitäten zu erstellen. Arbeiten Sie so, indem Sie Creators oder andere transformers vorübergehend deaktivieren, die in Streams sind, die Sie nicht wollen. Ich habe leere Beziehungen manuell erstellt, da Knowledge das Angeben von Ursprung und Ziel für Beziehungen unterstützt (damit es das Datenmodell anzeigen kann).<\/P>Komentieren Sie in diesem Beitrag, wenn Sie Fragen oder Beobachtungen haben. Viel Spaß mit Ihrem graph ETL!<\/P>