En cambio, estamos permitiendo que GraphQL, las definiciones de tipo, definan tanto el esquema para la API como la base de datos. Ahora veremos dónde podemos configurar el modelo de datos para la base de datos utilizando directivas de esquema. Por lo tanto, no es el caso en el que queremos tener una correspondencia exacta uno a uno todo el tiempo. A veces queremos tener algunas opciones de configuración o algunos nodos que no queremos exponer en la base de datos y así sucesivamente. Así que veremos cómo podemos configurar eso utilizando directivas de esquema.
El siguiente objetivo principal de la biblioteca Neo4j GraphQL es tomar esas definiciones de tipo donde hemos descrito solo los tipos, los campos en esos tipos, cómo se conectan esos tipos, donde hemos descrito ese gráfico básico, y luego generar automáticamente todas las operaciones comunes de API de GraphQL que necesitaríamos para trabajar con esos datos. Estas son las operaciones CRUD, crear, leer, actualizar, eliminar operaciones, por lo que los campos de consulta y mutación, pero también todas las pequeñas piezas que van junto con eso. Por ejemplo, los argumentos de campo para admitir el ordenamiento y la paginación y el filtrado complejo, y también agregar los tipos para cosas como fecha y hora o los tipos de datos geoespaciales, agregar funcionalidad para agregaciones, este tipo de cosas se generan a partir de esas definiciones básicas de tipo y se agregan al esquema de la API.
Luego, en el momento de la consulta, la biblioteca Neo4j GraphQL es capaz de tomar cualquier solicitud arbitraria de GraphQL y traducirla en una sola consulta de base de datos en este caso Cypher, y eso es importante por un par de razones. Una es que podemos evitar el problema de la consulta N más uno. Básicamente, hacemos una solicitud a la base de datos y una base de datos de gráficos como Neo4j está optimizada para recorrer el gráfico desde un nodo a cualquier otro al que estemos conectados, que es equivalente al anidamiento en nuestro conjunto de selección. Entonces, a menudo nuestras consultas de GraphQL, porque estamos obteniendo todos los datos para, por ejemplo, renderizar una vista en nuestra aplicación, a menudo podemos tener muchas estructuras anidadas en nuestro conjunto de selección que serían equivalentes a muchas uniones en una base de datos relacional, lo que puede tener algunos problemas de rendimiento cuando tengo muchos datos y muchas uniones, las cosas comienzan a desmoronarse. Pero una base de datos de gráficos, eso es exactamente para lo que están optimizadas las bases de datos de gráficos, estas travesías a través del gráfico de datos. Entonces, ese es un beneficio es abordar este problema de la consulta N más uno, permitiendo que la base de datos optimice esa travesía a través del gráfico de datos. Pero la otra gran ventaja aquí es que esto significa que no necesitamos escribir estas funciones de resolución porque las consultas de la base de datos se generan en el momento de la consulta, eso se encarga por nosotros. Así que aquí hay un gran impulso en la productividad del desarrollador que para comenzar, básicamente solo necesitamos definir las definiciones de tipo de GraphQL y apuntar el paquete a nuestra base de datos.
Ahora mencionamos varias veces esta idea de que queremos poder agregar lógica personalizada a nuestra API de GraphQL hasta ahora, solo hemos visto una lógica CRUD básica. Pero aquí hay un ejemplo donde hemos tomado una declaración Cypher. Entonces esto proviene de reseñas de negocios. En realidad, creo que este es un ejemplo del libro de GraphQL de pila completa, donde tenemos un sitio sobre negocios y reseñas de usuarios de negocios. Y hemos agregado un campo recomendado en el tipo de negocio que va a devolver una lista de negocios. Y aquí estamos recorriendo las reseñas de usuarios para encontrar negocios similares. Entonces una consulta de recomendación, algo similar a la de las películas de Matrix que escribimos hace un momento. Ahora, esta directiva de esquema cypher, por lo que puedes ver aquí, la sintaxis es at cypher y luego un argumento de declaración y esa es nuestra declaración cypher que tiene la lógica para esa consulta. Entonces dijimos anteriormente que las directivas de esquema son el mecanismo de extensión incorporado de GraphQL. Y así estamos extendiendo las definiciones de tipo para nuestra API de GraphQL para usar esta directiva de esquema cypher para adjuntar lógica personalizada a nuestras definiciones de tipo de GraphQL. Y luego, en el momento de la consulta, esta consulta, la consulta cypher que hemos adjuntado aquí al campo recomendado, se recoge en la consulta general generada de la base de datos. Por lo tanto, todavía podemos generar solo una consulta de base de datos en el momento de la consulta, agregamos esto como una especie de subconsulta en la declaración general generada.
Bien, ¿cómo usamos esta biblioteca Neo4j GraphQL? Bueno, se publica como un paquete npm. Por lo general, lo usaríamos junto con algo como Apollo Server o GraphQL Yoga, si estás familiarizado con el ecosistema de GraphQL de Node.js. Hay un par de dependencias principales Neo4j JavaScript Driver y luego la implementación de JavaScript de GraphQL. Aquí está el fragmento básico. Entonces, este es más o menos el código mínimo que necesitamos para comenzar. Creo que aquí profundizamos un poco más. Primero importamos algunos paquetes o importamos la biblioteca Neo4j GraphQL, el controlador de JavaScript de Neo4j, que nos permite hacer una conexión a nuestra base de datos y luego Apollo Server, que creo que es, probablemente, la implementación de servidor GraphQL de Node.js más común, GraphQL Yoga es otra popular, pero esto funciona con cualquiera de las implementaciones de servidor GraphQL de JavaScript. Luego definimos algunas definiciones de tipo. Entonces aquí tenemos, tenemos películas y géneros. Entonces solo una parte de los datos con los que estamos trabajando hoy. Y luego tenemos esta relación con tipo y dirección. Entonces dije antes que en el modelo de gráfico de propiedades con el que trabajamos en Neo4j, cada relación tiene un solo tipo y una dirección. Y debido a las convenciones de nomenclatura que son un poco diferentes del modelo de gráfico de propiedades que usamos con Neo4j y GraphQL, entonces GraphQL como un nombre de campo, generalmente usamos una convención de camel case como esta donde comenzamos con minúsculas y luego mayúsculas cada palabra. La convención en el modelo de gráfico de propiedades con Neo4j para los tipos de relación es usar, creo que esto se llama snake case donde tenemos todo en mayúsculas y luego guiones bajos para los espacios. Entonces, codificar esta información en una directiva de esquema de relación nos permite no mezclar estas convenciones, pero también nos permite capturar la dirección de la relación, que no tenemos ese concepto similar en GraphQL. Entonces aquí usamos esa directiva de esquema de relación para codificar un poco más de información. Luego creamos una instancia del controlador de JavaScript de Neo4j con nuestras credenciales de conexión a nuestra base de datos. Aquí se está ejecutando localmente, nombre de usuario y contraseña. Luego creamos una nueva instancia de Neo4j GraphQL que llamamos Neo Schema aquí, pasando nuestras definiciones de tipo y nuestro controlador, y esto pasa por un proceso de aumento de esquema donde básicamente estamos generando todas esas consultas y mutaciones, cosas como los argumentos de campo para la paginación y el ordenamiento, el filtrado, todas esas cosas y generando las funciones de resolución. Luego pasamos ese objeto de esquema, en este caso, a Apollo Server y servimos nuestra API de GraphQL. Por lo tanto, no tuvimos que escribir ninguna función de resolución, todas se generan automáticamente para nosotros. Bien, esos son los objetivos generales de la biblioteca Neo4j GraphQL.
Comments