Definice problému
Knowledge Graph entity (také známé jako uzly) jsou propojeny vztahy; hodnoty entity ESRI__ID jsou cizí klíče ve sloupcích vztahů ESRI__OriginID a ESRI__DestID. Hodnoty ID jsou odvozeny z datového typu GlobalID a jsou generovány systémem. Protože hodnoty ESRI__ID musí existovat na entitách před tím, než je můžete použít ve vztazích, mnoho lidí si myslí, že je potřeba vytvořit nebo udržovat graf ve dvou fázích, nejprve entity a poté samostatně vztahy, a nakonec mají dva nástroje ETL k řízení, nebo více, pokud se zpracování provádí pro každou kombinaci entity a vztahu. Toto není nutné.
Tento blog ukazuje, jak můžete udržovat graf pomocí jednoho nástroje ETL, který zapisuje jak entity, tak vztahy v jednom běhu.
Scénář grafu
Nejprve si prohlédněte povinnou - a velmi rušnou - mapu! Dnešní téma grafu jsou celosvětová data letišť a letů za 24 hodin před a po čase spuštění nástroje ETL, takže asi polovina letů je v minulosti a polovina je naplánována na blízkou budoucnost. Všimněte si, že trasy letů nemodelují skutečné letecké trasy, graf má pouze modelovat konektivitu. Více o scénářích použití je níže.
Světová letiště a lety
Nástroj ETL
Data poskytuje FlightAware ze svých AeroAPI koncových bodů, přístupných tímto nástrojem ETL - dostupným ke stažení v blogu. Budete potřebovat svůj vlastní API klíč.
Jednopřechodový nástroj ETL pro údržbu grafu
I když nemáte přístup k AeroAPI, stáhněte si a rozbalte přílohu blogu a nainstalujte obsah následovně (vyžaduje ArcGIS Data Interoperability pro Pro 3.5+):
- Create.fmw - umístěte tento zdrojový soubor workspace do domovské složky projektu Pro
- Volitelně vytvořte nástroj ETL s fmw jako zdrojem
- LoopingAirportsGetter.fmx - vlastní transformátor používaný Create.fmw
- Umístěte jej do své uživatelské profilové složky C:\Users\<yourusername>\Documents\FME\Transformers
V nástrojích je spousta užitečného materiálu, ale abyste se okamžitě dostali k hlavnímu cíli blogu - jak zapisovat entity a vztahy v jednom workspace - uvidíte v Create.fmw, že nejprve zapíšete entity do grafu pomocí transformátoru FeatureWriter, poté použijete výstupní port Summary FeatureWriter k vyvolání čtení entit zpět do workspace pomocí transformátoru FeatureReader - ty pak mají hodnoty ESRI__ID, které potřebujete. Workspace není uspořádán kompaktně, aby ukázal toto sekvenční zpracování, ale hledejte transformátor pojmenovaný FeatureWriter, který zapisuje letiště, a uvidíte přímé spojení z jeho portu Summary na transformátor pojmenovaný FeatureReader čtoucí právě zapsaná letiště. Porty Summary vydávají jeden nespatný prvek s několika identifikačními a statistickými vlastnostmi po dokončení zápisu transakce.
Zápis vztahů lze provést pomocí běžných Esri Knowledge Graph zapisovačů, protože nemají žádnou závislost na následném zpracování. Pokud jste dnes přišli jen kvůli tomu, není třeba číst dál, ale pokud máte rádi hluboké ponory do ETL, pravděpodobně se něco naučíte v dalším textu, tak pokračujte ve čtení!
Tvořím graf s daty získanými z API a jedná se o standardní moderní postup - REST volání vracejí stránkované JSON odpovědi a celé API má specifikaci OpenAPI. Můžete si prohlédnout API na této URL adrese a všimnout si odkazu na specifikaci OpenAPI.
Jelikož je specifikace OpenAPI dostupná, může být importována do transformátoru OpenAPICaller, který promění konstrukci HTTP volání na vyplňování formuláře. Zde je první OpenAPICaller ve workspace. Všimněte si, že žádám o 100 stránek (1500 záznamů) dat letišť a hlavička obsahuje parametr nástroje pro API klíč a požadavek na přijetí JSON odpovědi. Schéma letišť není příliš široké, takže 1500 záznamů nepřetěžuje HTTP GET odpověď ani nezpůsobuje chyby, ale získávám pouze počáteční sadu záznamů, ne všechna data letišť.
OpenAPICaller pro letiště
API podporuje stránkování. Pokud požadavek nevrátí poslední dostupné záznamy na serveru, pak je v odpovědi dostupný JSON objekt nazvaný next (URL), jehož odesláním jako požadavku se vrátí další sada stránek. To se hodí pro smyčku k získání všech dat, což dělá vlastní transformátor LoopingAirportsGetter.
LoopingAirportsGetter
Jelikož je další URL sestavena za nás, můžeme použít jednoduchý HTTPCaller v tomto vlastním transformátoru, nikoli další OpenAPICaller. Nyní máme všechna data letišť a můžeme zapsat typ entity.
Pokud si nástroj prohlédnete podrobněji, uvidíte, že poté co jsou entity letišť zapsány do grafu, jsou opět načteny (s hodnotami ESRI__ID) a další OpenAPICaller získává lety pro každé letiště. Tentokrát se načítá 50 stránek dat na jedno volání (schéma je širší), ale můžeme mít současně až 25 volání aktivních, protože neprocházíme stránkováním jedním velkým kurzorem na backendu, ale lety každého letiště zvlášť.
OpenAPICaller pro lety
K dispozici je několik letišť po celém světě s více než 50 stránkami letů (750 záznamů) za 48 hodin a tyto jsou načítány pomocí HTTPCaller pokud next není null z počátečního požadavku.<\/P>
Poznamenejte si parametry dotazu start<\/STRONG> a end<\/STRONG>. Jsou to UTC časová razítka ve formátu ISO, generovaná při spuštění nástroje pomocí skriptovaných parametrů - takže do mého ETL nástroje pronikl nějaký kód! To by šlo udělat pomocí transformerů.<\/P>The Graph v ArcGIS<\/H4> <\/P>Nechám vás prozkoumat nástroj, abyste si prohlédli logiku konstrukce entit a vztahů, ale v zásadě jsou typy entit Airports<\/STRONG> (body) a Flights<\/STRONG> (dvoubodové čáry) a vztahy jsou letiště mají odlety na letech (HasDeparture<\/STRONG>), lety mohou mít spojení na jiné lety (HasConnection<\/STRONG>) a lety mají přílety na letiště (HasArrival<\/STRONG>). Podniková logika použitá pro spojení je taková, že lety jsou propojeny, pokud příletový let přistane mezi 1 a 4 hodinami před odletem odletového letu. V reálném životě mohou být další faktory jako souhlas s code share, ale toto je jen demo!<\/P>Zde je pohled na datový model grafu, letiště a lety mají vztahy mezi sebou a lety mají spojení s jinými lety. Entita Document není použita.<\/P>
FlightAware Graph Data Model<\/span><\/span><\/P>Nyní uděláme analytický dotaz! Řekněme, že jsem policista a chci požádat aerolinky a letiště, aby zkontrolovaly seznamy pasažérů a nedávné videozáznamy kvůli podezřelému zloději šperků, o kterém si myslím, že opustil Los Angeles směřující do Berlína, nebo se tam chystá jet. Které aerolinky, lety a letiště dávají největší smysl oslovit? Samozřejmě použiji své openCypher<\/A> dovednosti a využiji svůj denně aktualizovaný graf!<\/P>Nechám vás projít kód, ale co dělá, je najít nejkratší cestu podle doby letu mezi Los Angeles a Berlin-Brandenberg, maximálně přes 4 letové úseky.<\/P>
match path = (origin:Airports)-[:HasDeparture|:HasConnection*0..3]->(:Flights)-[:HasArrival]->(destination:Airports)
Diskuse<\/H4> <\/P>Toto demonstruje jak přístup jednoho nástroje, tak mnohem více kolem používání API dat a Knowledge Graphs.<\/STRONG> ETL pracovní prostor v downloadu je připraven k běhu za předpokladu, že máte API klíč a již jste graf vytvořili dříve - je aktualizován. Nástroj lze spustit pomocí běžné funkce plánování nástrojů v ArcGIS Pro, například každý den. Nebudete na tomto stavu začínat, ale uvidíte některé Creator transformery, které lze použít k manuálnímu spuštění nástroje po částech, například k vytvoření entit Airports. Pracujte tímto způsobem dočasným zakázáním Creatorů nebo jiných transformerů ve streamech, které nechcete používat. Ručně jsem vytvořil prázdné vztahy, protože Knowledge podporuje specifikaci původu a cíle pro vztahy (aby mohl zobrazit datový model).<\/P>Komentujte tento příspěvek, pokud máte otázky nebo poznámky. Bavte se se svým grafovým ETL!<\/P>