Uso delle direttive per uno schema GraphQL - Amazon Neptune

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Uso delle direttive per uno schema GraphQL

Puoi iniziare da uno schema GraphQL che contiene già delle direttive, usando un comando come questo:

neptune-for-graphql \ --input-schema-file (your GraphQL schema file with directives) \ --create-update-aws-pipeline \ --create-update-aws-pipeline-name (name for your new GraphQL API) \ --create-update-aws-pipeline-neptune-endpoint (empty Neptune database endpoint):(port number) \ --output-resolver-query-https

Puoi modificare le direttive create dall'utilità o aggiungere direttive personalizzate a uno schema GraphQL. Di seguito sono descritti alcuni modi per usare le direttive:

Esecuzione dell'utilità in modo che non generi mutazioni

Per impedire all'utilità di generare mutazioni nell'API GraphQL, usa l'opzione --output-schema-no-mutations nel comando neptune-for-graphql.

Direttiva @alias

La direttiva @alias può essere applicata ai tipi o ai campi dello schema GraphQL. Essa esegue la mappatura di nomi diversi tra il database a grafo e lo schema GraphQL. La sintassi è:

@alias(property: (property name))

Nell'esempio seguente, airport è l'etichetta del nodo del database a grafo mappata al tipo GraphQL Airport, mentre desc è la proprietà del nodo del grafo mappata al campo description (consulta l'esempio per Air Routes):

type Airport @alias(property: "airport") { city: String description: String @alias(property: "desc") }

Nota che la formattazione GraphQL standard richiama nomi di tipo Pascal-casing e nomi di campo camel-casing.

Direttiva @relationship

La direttiva @relationship mappa i tipi GraphQL annidati agli archi del database a grafo. La sintassi è:

@relationship(edgeType: (edge name), direction: (IN or OUT))

Di seguito è illustrato un esempio di comando:

type Airport @alias(property: "airport") { ... continentContainsIn: Continent @relationship(edgeType: "contains", direction: IN) countryContainsIn: Country @relationship(edgeType: "contains", direction: IN) airportRoutesOut(filter: AirportInput, options: Options): [Airport] @relationship(edgeType: "route", direction: OUT) airportRoutesIn(filter: AirportInput, options: Options): [Airport] @relationship(edgeType: "route", direction: IN) }

Puoi trovare le direttive @relationship sia nell'esempio Todo che nell'esempio Air Routes.

Direttive @graphQuery e @cypher

Puoi definire query openCypher per risolvere un valore di campo, aggiungere query o aggiungere mutazioni. Ad esempio, puoi aggiungere un nuovo campo outboundRoutesCount al tipo Airport per contare le route in uscita:

type Airport @alias(property: "airport") { ... outboundRoutesCount: Int @graphQuery(statement: "MATCH (this)-[r:route]->(a) RETURN count(r)") }

Di seguito è riportato un esempio con nuove query e mutazioni:

type Query { getAirportConnection(fromCode: String!, toCode: String!): Airport \ @cypher(statement: \ "MATCH (:airport{code: '$fromCode'})-[:route]->(this:airport)-[:route]->(:airport{code:'$toCode'})") } type Mutation { createAirport(input: AirportInput!): Airport @graphQuery(statement: "CREATE (this:airport {$input}) RETURN this") addRoute(fromAirportCode:String, toAirportCode:String, dist:Int): Route \ @graphQuery(statement: \ "MATCH (from:airport{code:'$fromAirportCode'}), (to:airport{code:'$toAirportCode'}) \ CREATE (from)-[this:route{dist:$dist}]->(to) \ RETURN this") }

Nota: se ometti RETURN, il resolver presume che la parola chiave this sia l'ambito di restituzione.

Puoi anche aggiungere una query o una mutazione usando una query Gremlin:

type Query { getAirportWithGremlin(code:String): Airport \ @graphQuery(statement: "g.V().has('airport', 'code', '$code').elementMap()") # single node getAirportsWithGremlin: [Airport] \ @graphQuery(statement: "g.V().hasLabel('airport').elementMap().fold()") # list of nodes getCountriesCount: Int \ @graphQuery(statement: "g.V().hasLabel('country').count()") # scalar }

Al momento le query Gremlin sono limitate a quelle che restituiscono valori scalari, ovvero elementMap() per un singolo nodo o elementMap().fold() per un elenco di nodi.

Direttiva @id

La direttiva @id identifica il campo mappato all'entità del database a grafo id. I database a grafo come Amazon Neptune hanno sempre un id univoco per nodi e archi che viene assegnato durante le importazioni in blocco o generato automaticamente. Per esempio:

type Airport { _id: ID! @id city: String code: String }

Nomi di tipo, query e mutazione riservati

L'utilità genera automaticamente query e mutazioni per creare un'API GraphQL funzionante. Il modello di questi nomi è riconosciuto dal resolver ed è riservato. Di seguito sono riportati alcuni esempi del tipo Airport e del tipo di connessione Route:

Il tipo Options è riservato.

input Options { limit: Int }

I parametri filter e options della funzione sono riservati.

type Query { getNodeAirports(filter: AirportInput, options: Options): [Airport] }

Il prefisso getNode dei nomi delle query è riservato, e anche i prefissi dei nomi delle mutazioni comecreateNode, updateNode, deleteNode, connectNode, deleteNode, updateEdge e deleteEdge sono riservati.

type Query { getNodeAirport(id: ID, filter: AirportInput): Airport getNodeAirports(filter: AirportInput): [Airport] } type Mutation { createNodeAirport(input: AirportInput!): Airport updateNodeAirport(id: ID!, input: AirportInput!): Airport deleteNodeAirport(id: ID!): Boolean connectNodeAirportToNodeAirportEdgeRout(from: ID!, to: ID!, edge: RouteInput!): Route updateEdgeRouteFromAirportToAirport(from: ID!, to: ID!, edge: RouteInput!): Route deleteEdgeRouteFromAirportToAirport(from: ID!, to: ID!): Boolean }

Applicazione di modifiche allo schema GraphQL

Puoi modificare lo schema di origine GraphQL ed eseguire nuovamente l'utilità, ottenendo lo schema più recente dal database Neptune. Ogni volta che l'utilità rileva un nuovo schema nel database, genera un nuovo schema GraphQL.

Puoi anche modificare manualmente lo schema di origine GraphQL ed eseguire nuovamente l'utilità utilizzando come input lo schema di origine anziché l'endpoint del database Neptune.

Infine, puoi inserire le modifiche in un file utilizzando questo formato JSON:

[ { "type": "(GraphQL type name)", "field": "(GraphQL field name)", "action": "(remove or add)", "value": "(value)" } ]

Per esempio:

[ { "type": "Airport", "field": "outboundRoutesCountAdd", "action": "add", "value":"outboundRoutesCountAdd: Int @graphQuery(statement: \"MATCH (this)-[r:route]->(a) RETURN count(r)\")" }, { "type": "Mutation", "field": "deleteNodeVersion", "action": "remove", "value": "" }, { "type": "Mutation", "field": "createNodeVersion", "action": "remove", "value": "" } ]

Quindi, quando esegui l'utilità su questo file utilizzando il parametro --input-schema-changes-file nel comando, l'utilità applica le modifiche tutte insieme.