type Product {
productID: ID!
name: String @search(by: [term])
reviews: [Review] @hasInverse(field: about)
}
type Customer {
username: String! @id @search(by: [hash, regexp])
reviews: [Review] @hasInverse(field: by)
}
type Review {
id: ID!
about: Product!
by: Customer!
comment: String @search(by: [fulltext])
rating: Int @search
}
deploy
You now have a GraphQL API up and running and a graph database as a backend.GraphQL endpoint
with any GraphQL clients such as GraphQL Playground, Insomnia, GraphiQL, Altair or Postman. If you want to use those clients, copy the GraphQL endpoint
from the Cloud dashboard. You may want to use the introspection capability of the client to explore the schema, queries, and mutations that were generated by Dgraph. A first GraphQL mutationTo populate the database,
mutation {
addProduct(
input: [
{ name: "GraphQL on Dgraph" }
{ name: "Dgraph: The GraphQL Database" }
]
) {
product {
productID
name
}
}
addCustomer(input: [{ username: "Michael" }]) {
customer {
username
}
}
}
{
"data": {
"addProduct": {
"product": [
{
"productID": "0x2",
"name": "GraphQL on Dgraph"
},
{
"productID": "0x3",
"name": "Dgraph: The GraphQL Database"
}
]
},
"addCustomer": {
"customer": [
{
"username": "Michael"
}
]
}
},
"extensions": {
"requestID": "b155867e-4241-4cfb-a564-802f2d3808a6"
}
}
username: String! @id
, the username
field acts like an ID, so we can identify customers just with their names. Products, on the other hand, had productID: ID!
, so they’ll get an auto-generated ID which are returned by the mutation.
0x2
. Make sure to replace the product ID with the ID from the response of the previous mutation.mutation {
addReview(
input: [
{
by: { username: "Michael" }
about: { productID: "0x2" }
comment: "Fantastic, easy to install, worked great. Best GraphQL server available"
rating: 10
}
]
) {
review {
comment
rating
by {
username
}
about {
name
}
}
}
}
This time, the mutation result queries for the author making the review and the product being reviewed, so it’s gone deeper into the graph to get the result than just the mutation data.
{
"data": {
"addReview": {
"review": [
{
"comment": "Fantastic, easy to install, worked great. Best GraphQL server available",
"rating": 10,
"by": {
"username": "Michael"
},
"about": {
"name": "GraphQL on Dgraph"
}
}
]
}
},
"extensions": {
"requestID": "11bc2841-8c19-45a6-bb31-7c37c9b027c9"
}
}
type Review {
...
comment: String @search(by: [fulltext])
...
}
The directive @search(by: [fulltext])
tells Dgraph we want to be able to search for comments with full-text search. Dgraph took that directive and the other information in the schema, and built queries and search into the API. Let’s find all the products that were easy to install.
query {
queryReview(filter: { comment: { alloftext: "easy to install" } }) {
comment
by {
username
}
about {
name
}
}
}
query {
queryReview(
filter: { comment: { alloftext: "best GraphQL" }, rating: { ge: 10 } }
) {
comment
by {
username
}
about {
name
}
}
}
How about we find the customers with names starting with “Mich” and the five products that each of those liked the most.
query {
queryCustomer(filter: { username: { regexp: "/Mich.*/" } }) {
username
reviews(order: { asc: rating }, first: 5) {
comment
rating
about {
name
}
}
}
}
ConclusionDgraph allows you to have a fully functional GraphQL API in minutes with a highly scalable graph backend to serve complex nested queries. Moreover, you can update or change your schema freely and just re-deploy new versions. For GraphQL in Dgraph, you just concentrate on defining the schema of your graph and how you’d like to search that graph. Dgraph does the rest. What’s nextLearn more about GraphQL schema and Dgraph directives.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4