Seria como uma mistura de GraphQL com GraphQL + - da Dgraph. No entanto, se pudéssemos injetar a consulta Dgraph como fazemos em cURL. Dgraph seria totalmente compatível com Apollo.
curl -X POST -H 'X-Dgraph-LinRead: {"1": 12}' localhost:8080/query -d $'
{
balances(func: anyofterms(name, "Alice Bob")) {
uid
name
balance
}
}' | jq
Mais informações em: https://docs.dgraph.io/clients/#raw -http
por exemplo;
const query = gql`
query Dgraph {
apartments@rest(type: "query", path: "query", endpoint: "DgraphEnd") {
bhk
uid
}
}
`;
`` JS
const query = gql
query Dgraph {
apartamentos (func: eq (Neighborhood.name, "Lutyens")) @rest (type: "query", path: "query", endpoint: "DgraphEnd") {
bhk
uid
}
}
`;
Mutation example:
```bash
curl -X POST localhost:8080/mutate -H 'X-Dgraph-MutationType: json' -H 'X-Dgraph-CommitNow: true' -d $'
{
"set": [
{"name": "Alice"},
{"name": "Bob"}
]
}' | jq
Felicidades.
Descobri que podemos passar a Consulta Dgraph através do "Corpo bruto" no Postman. Então isso é um sinal de que talvez seja possível Dgraph trabalhar com apollo-link-rest
PS. Acho que o "bodyBuilder: $ customBuilder" pode ser o caminho. Mas não tenho certeza de como isso funciona.
BTW, você pode testar https://play.dgraph.io/query
basta apontar o Postman para esse endpoint, definir "POST" e em Body definir RAW e colar a consulta abaixo.
Preste atenção que o UID pode mudar no futuro
{
node(func: uid(0x36bb9)) {
uid
expand(_all_) {
uid
expand(_all_)
}
}
}
Parece um grande projeto. - Não acho que a parte difícil seja usar apollo-link-rest
- como você disse, é basicamente usar customBodyBuilder
, ou usar uma implementação customFetch
. - Acho que a parte difícil será "gerar" as cargas úteis compatíveis com Dgraph
corretas.
Por favor, deixe-nos saber o que você descobriu - mas parece-me que você precisará fazer um "Gerador de Consultas" bastante extenso que seria usado como uma implementação customFetch.
Dgraph é um banco de dados que tem sua linguagem inspirada no GraphQL. É chamado de "GraphQL + -". É um gráfico de banco de dados com uma linguagem de gráfico. No entanto, existem muitos recursos que não existem no GraphQL, mas ainda são compatíveis. E de fato é um grande projeto.
Acho que podemos trabalhar no Dgraph para dar suporte ao apollo-link-rest, mas eu queria entender se já posso fazer algo com o que está disponível (como um "hack"). Não encontrei nenhum exemplo personalizável que pudesse enviar o "Corpo" como exemplifiquei usando o Postman.
Injetar o corpo com texto RAW seria uma maneira fácil de fazer o Dgraph funcionar com apollo-link-rest. Porque a resposta está em JSON. Não tem segredo.
Olhando para este projeto Apollo eu vejo um grande potencial com Dgraph.
Felicidades.
@MichelDiz - se for esse o caso, quase parece que você pode querer fazer um fork de apollo-link-rest
e fazer apollo-link-dgraph
Possivelmente, a melhor solução seria desembolsar apollo-link-http
? - essa camada fala GraphQL, portanto, gerar saída do tipo GraphQL a partir do GraphQL pode ser mais fácil?
Não tenho certeza sobre apollo-link-http, porque Dgraph GraphQL + - não é compatível com graphql-tag tho.
Eu havia tentado antes, sem sucesso, acessar o link Apollo com o endpoint do Dgraph, e o corpo da solicitação é diferente. Embora / graphql aceite a consulta em "chave de consulta", Dgraph não possui um campo "Consulta", apenas um campo RAW. Mas acho que isso pode ser avaliado. Não sou o dev do Dgraph (vá lang), mas estou falando sobre essa situação com a equipe.
Portanto, as principais diferenças são a tag graphql e a posição da carga útil da consulta. Como apollo-link-rest também usa graphql-tag, pensei em criar uma diretiva @ 'para injetar a consulta Dgraph (como corpo) e usar GraphQL também. Assim como você faz em "path:". Mas isso é apenas especulação. A ideia ainda é prematura.
por exemplo:
const dgraphQ = `
{
users (func: has(user), first:1000 ) {
id : uid
name
email
}
}
`;
const query = gql`
query dgraphTest(
$customBuilder: any
) {
users @rest(type: "User ", bodyBuilder: $customBuilder, method: "POST") {
#Maybe bodyKey?? I'll test it
id
name
email
}
}
`;
apolloClient.query({
query: Query,
variables: {
input: { customBuilder: dgraphQ }
}
}).then(response => {
console.log(response);
});
Abaixo está a diferença entre o corpo da solicitação de Dgraph e GraphQL.
POST /graphql HTTP/1.1
Host: api.githunt.com
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: xxxxx
query=%7B%0A++++feed+(type%3A+NEW%2C+limit%3A+5)+%7B%0A++++++repository+%7B%0A++++++++owner+%7B+login+%7D%0A++++++++name%0A++++++%7D%0A%0A++++++postedBy+%7B+login+%7D%0A++++%7D%0A++%7D%0A++
POST /query HTTP/1.1
Host: play.dgraph.io
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: xxxxx
{
node(func: uid(0x36bb9)) {
uid
expand(_all_) {
uid
expand(_all_)
}
}
}------WebKitFormBoundary7MA4YWxkTrZu0gW--
Ir diretamente do cliente para o DGraph parece um desafio, e pode não deixar espaço para conceitos como autorização ou lógica de negócios. Não que não tivesse utilidade, com certeza - um link como você descreve seria ótimo para criar um cliente que explora facilmente um gráfico público diretamente.
Estou interessado em usar DGraph como o armazenamento de dados principal para um aplicativo de consumidor, então estou usando uma abordagem diferente e tentando tornar muito fácil fazer a interface de um aplicativo Apollo Server padrão para um back-end DGraph, convertendo consultas GraphQL de entrada em consultas DGraph usando um AST personalizado (inspirado em projetos como join-monster ). Ainda estou pensando na ideia em meu tempo livre, então sem promessas na entrega.
https://github.com/a-type/dgraphql
Talvez qualquer camada de conversão de consulta que eu crie possa ser portável para o cliente também, de modo que possa ser extraída para uma biblioteca reutilizável que um hipotético apollo-link-dgraph
também possa utilizar. Atualmente, porém, confio muito em ser capaz de ler o próprio esquema para gerar esse AST.