Basics
For the purposes of this section we will consider the default module containing the following schema:
type Author {property name -> str;}type Book {# to make the examples simpler only the title is# a required propertyrequired property title -> str;property synopsis -> str;link author -> Author;property isbn -> str {constraint max_len_value(10);}}
From the schema above EdgeDB will expose to GraphQL:
Object types:
AuthorandBookscalars
StringandID
In addition to this the Query will have 2 fields: Author, and Book to query these types respectively.
Queries
Consider this example:
GraphQL | EdgeQL equivalent |
|---|---|
Copy
| Copy
|
The top-level field of the GraphQL query must be a valid name of an object type or an expression alias of something returning an object type. Nested fields must be valid links or properties.
There are some specific conventions as to how arguments in GraphQL queries are used to allow filtering, ordering, and paginating data.
Filtering
Filtering the retrieved data is done by specifying a filter argument. The filter argument is customized to each specific type based on the available fields. In case of the sample schema, here are the specifications for available filter arguments for querying Book:
# this is Book-specificinput FilterBook {# basic boolean operators that combine conditionsand: [FilterBook!]or: [FilterBook!]not: FilterBook# fields available for filtering (properties in EdgeQL)title: FilterStringsynopsis: FilterStringisbn: FilterStringauthor: NestedFilterAuthor}# this is Author-specificinput NestedFilterAuthor {# instead of boolean operations, "exists" check is available# for linksexists: Boolean# fields available for filtering (properties in EdgeQL)name: FilterString}# this is genericinput FilterString {# "exists" check is available for every property, tooexists: Boolean# equalityeq: Stringneq: String# lexicographical comparisongt: Stringgte: Stringlt: Stringlte: String# other useful operationslike: Stringilike: String}
Here are some examples of using a filter:
GraphQL | EdgeQL equivalent |
|---|---|
Copy
| Copy
|
Copy
| Copy
|
It is legal to provide multiple input fields in the same input object. They are all implicitly combined using a logical conjunction. For example:
GraphQL | EdgeQL equivalent |
|---|---|
Copy
| Copy
|
It is possible to search for books that don’t specify the author for some reason:
GraphQL | EdgeQL equivalent |
|---|---|
Copy
| Copy
|
Ordering
Ordering the retrieved data is done by specifying an order argument. The order argument is customized to each specific type based on the available fields, much like the filter. In case of the sample schema, here are the specifications for the available filter arguments:
# this is Author-specificinput OrderAuthor {# fields available for ordering (properties in EdgeQL)name: Ordering}# this is Book-specificinput OrderBook {# fields available for ordering (properties in EdgeQL)title: Orderingsynopsis: Orderingisbn: Ordering}# this is genericinput Ordering {dir: directionEnumnulls: nullsOrderingEnum}enum directionEnum {ASCDESC}enum nullsOrderingEnum {SMALLEST # null < any other valueBIGGEST # null > any other value}
If the value of nulls is not specified it is assumed to be SMALLEST.
GraphQL | EdgeQL equivalent |
|---|---|
Copy
| Copy
|
Paginating
Paginating the retrieved data is done by providing one or more of the following arguments: first, last, before, and after. The pagination works in a similar way to Relay Connections. In case of the sample schema, here are the specifications for the available filter arguments:
# a relevant Query definition snippettype Query {Author(filter: FilterAuthor,order: OrderAuthor,after: String,before: String,first: Int,last: Int,): [Author!]# ... other Query fields}
The after and before strings are, in fact, string representations of numeric indices under the particular filter and ordering (starting at “0”). This makes the usage fairly intuitive even without having Relay Connection edges and cursors.
The objects corresponding to the indices specified by before or after are not included.
GraphQL | EdgeQL equivalent |
|---|---|
Copy
| Copy
|
Copy
| Copy
|
Copy
| Copy
|
Variables
It is possible to use variables within GraphQL queries. They are mapped to variables in EdgeQL.
GraphQL | EdgeQL equivalent |
|---|---|
Copy
| Copy
|
Copy