Definición del Problema
Entidades de Knowledge Graph (también conocidas como nodos) están vinculadas por relaciones; los valores ESRI__ID de las entidades son claves foráneas en las columnas de relación ESRI__OriginID y ESRI__DestID. Los valores ID se derivan del tipo de dato GlobalID, y son generados por el sistema. Debido a que los valores ESRI__ID deben existir en las entidades antes de poder usarlos en relaciones, muchas personas piensan que es necesario crear o mantener un grafo en dos etapas, primero las entidades y luego por separado las relaciones, y terminan con dos herramientas ETL para gestionar, o más si el procesamiento se hace por combinación de entidad y relación. Esto es innecesario.
Este blog muestra cómo puedes mantener un grafo usando una sola herramienta ETL que escribe tanto entidades como relaciones en una sola ejecución.
Escenario del Grafo
Primero, ¡mira el obligatorio - y muy ocupado - mapa! El tema del grafo de hoy es datos mundiales de aeropuertos y vuelos para 24 horas antes y después del tiempo de ejecución de la herramienta ETL, así que aproximadamente la mitad de los vuelos están en el pasado y la otra mitad está programada para el futuro cercano. Nota que las rutas de vuelo no modelan rutas reales de aeronaves, el grafo solo pretende modelar la conectividad. Más sobre escenarios de uso abajo.
Aeropuertos y vuelos mundiales
La Herramienta ETL
Los datos son proporcionados por FlightAware desde sus puntos finales AeroAPI, accedidos por esta herramienta ETL - disponible en la descarga del blog. Necesitarás tu propia clave API.
Herramienta ETL de pasada única para mantenimiento del grafo
Aun si no tienes acceso a AeroAPI, descarga y descomprime el archivo adjunto del blog e instala el contenido como sigue (requiere ArcGIS Data Interoperability para Pro 3.5+):
- Create.fmw - coloca este archivo fuente del espacio de trabajo en la carpeta principal de un proyecto Pro
- Opcionalmente crea una herramienta ETL usando el fmw como fuente
- LoopingAirportsGetter.fmx - un transformador personalizado usado por Create.fmw
- Ponlo en tu carpeta de perfil de usuario C:\Users\<tuusuario>\Documents\FME\Transformers
Hay mucho material útil que cubriremos en las herramientas, pero para ir directamente al objetivo principal del blog - cómo escribir entidades y relaciones en un solo espacio de trabajo - verás en Create.fmw que primero escribes entidades en el grafo con un transformador FeatureWriter, luego usas el puerto Summary de FeatureWriter para activar la lectura de las entidades nuevamente dentro del espacio de trabajo con un transformador FeatureReader - entonces tienen los valores ESRI__ID que necesitas. El espacio de trabajo no está dispuesto compactamente para mostrar esta secuencia pero busca el transformador llamado FeatureWriter que escribe aeropuertos y verás una conexión directa desde su puerto Summary al transformador llamado FeatureReader que lee los aeropuertos recién escritos. Los puertos Summary emiten una sola característica no espacial con algunas propiedades identificativas y estadísticas después de que se confirma la transacción de escritura.
Escribir relaciones puede hacerse con escritores ordinarios de Esri Knowledge Graph ya que no tienen dependencia aguas abajo. Si eso es todo lo que buscabas hoy entonces no necesitas leer más, pero si disfrutas profundizar en ETL probablemente aprenderás algo en el resto del post, ¡así que sigue leyendo!
Estoy creando un grafo con datos obtenidos desde una API, y uno que sigue la práctica moderna estándar - las llamadas REST devuelven respuestas JSON paginadas, y toda la API tiene una especificación OpenAPI. Puedes inspeccionar la API en esta URL y notar el enlace a la especificación OpenAPI.
Dado que la especificación OpenAPI está disponible, puede importarse a un transformador OpenAPICaller, que convierte la construcción de llamadas HTTP en un ejercicio de llenado de formularios. Aquí está el primer OpenAPICaller en el espacio de trabajo. Observa que estoy solicitando 100 páginas (1500 registros) de datos de aeropuertos y el encabezado incluye un parámetro herramienta para la clave API y una solicitud para recibir una respuesta JSON. El esquema de aeropuertos no es muy ancho así que 1500 registros no sobrecargan la respuesta HTTP GET ni causan errores, pero solo estoy obteniendo un conjunto inicial de registros, no todos los datos de aeropuertos.
OpenAPICaller para Aeropuertos
La API soporta paginación. Si una solicitud no devuelve los últimos registros disponibles en el servidor entonces hay un objeto JSON llamado next (una URL) disponible en la respuesta, enviarlo como solicitud devuelve el siguiente conjunto de páginas. Esto se presta a un bucle para obtener todos los datos, que es lo que hace el transformador personalizado LoopingAirportsGetter.
LoopingAirportsGetter
Dado que la siguiente URL se construye para nosotros podemos usar un simple HTTPCaller en el transformador personalizado, no otro OpenAPICaller. Ahora tenemos todos los datos de aeropuertos y podemos escribir el tipo entidad.
Si inspeccionas la herramienta, verás que después de escribir las entidades aeropuerto en el grafo estas se leen nuevamente (con valores ESRI__ID) y otro OpenAPICaller obtiene vuelos para cada aeropuerto. Esta vez se recuperan 50 páginas de datos por llamada (el esquema es más ancho) pero podemos tener 25 llamadas simultáneas ya que no estamos paginando a través de un cursor grande en el backend, sino los vuelos por cada aeropuerto.
OpenAPICaller para Vuelos
Hay un puñado de aeropuertos mundialmente con más de 50 páginas de vuelos (750 registros) durante 48 horas y estos se recuperan con un HTTPCaller si next no es nulo desde una solicitud inicial.<\/P>
Nota los parámetros de consulta start<\/STRONG> y end<\/STRONG>. Estos son marcas de tiempo UTC en formato ISO, generadas al inicio de la herramienta mediante parámetros scriptados - ¡así que algo de código se coló en mi herramienta ETL! Esto podría hacerse con transformers.<\/P>El Graph en ArcGIS<\/H4> <\/P>Te dejaré explorar la herramienta para inspeccionar la lógica de construcción de entidades y relaciones, pero básicamente los tipos de entidad son Airports<\/STRONG> (puntos) y Flights<\/STRONG> (líneas de 2 puntos) y las relaciones son que los aeropuertos tienen salidas en vuelos (HasDeparture<\/STRONG>), los vuelos pueden tener conexiones con otros vuelos (HasConnection<\/STRONG>) y los vuelos tienen llegadas a aeropuertos (HasArrival<\/STRONG>). La lógica de negocio usada para las conexiones es que los vuelos están conectados si un vuelo entrante aterriza entre 1 y 4 horas antes de que el vuelo saliente despegue. En la vida real podrían haber otros factores como acuerdos de code share, pero esto es solo una demo!<\/P>Aquí está la vista del modelo de datos del graph, aeropuertos y vuelos tienen relaciones entre sí y los vuelos tienen conexiones con otros vuelos. La entidad Document no se usa.<\/P>
FlightAware Graph Data Model<\/span><\/span><\/P>¡Ahora hagamos una consulta analítica! Supongamos que soy un oficial de policía y quiero pedir a las aerolíneas y aeropuertos que revisen los manifiestos de pasajeros y grabaciones recientes para un ladrón de joyas sospechoso que creo salió de Los Ángeles para viajar a Berlín, o está a punto de hacerlo. ¿Qué aerolíneas, vuelos y aeropuertos tienen más sentido consultar? Por supuesto saco mis habilidades openCypher<\/A> y uso mi graph actualizado diariamente!<\/P>Te dejaré revisar el código, pero lo que hace es encontrar el camino con el tiempo de vuelo más corto entre Los Ángeles y Berlin-Brandenberg, con un máximo de 4 tramos de vuelo.<\/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> Se devuelve un camino desde mi consulta....<\/P>
Discusión<\/H4> <\/P>Esto demuestra tanto el enfoque de herramienta única como mucho más sobre el uso de datos API y Knowledge Graphs.<\/STRONG> El espacio ETL en la descarga está listo para ejecutarse asumiendo que tienes una clave API y ya has construido el graph antes - está actualizado. La herramienta puede ejecutarse usando la función regular de programación de herramientas de ArcGIS Pro, digamos cada día. No estarás en este estado al principio, pero verás algunos transformers Creator que pueden usarse para ejecutar la herramienta manualmente por partes, por ejemplo para crear las entidades Airports. Trabaja así deshabilitando temporalmente Creators u otros transformers que estén en flujos que no quieres. Creé relaciones vacías manualmente ya que Knowledge soporta especificar el origen y destino para relaciones (para poder mostrar el modelo de datos).<\/P>Comenta en esta publicación si tienes preguntas u observaciones. ¡Diviértete con tu ETL graph!<\/P>