An object property
{
hero {
name
# subselection of fields for objects
# ie returns only selected field for object
friends {
name
}
}
}
Fields accept arguments
{
human(id: "1000") {
name
height(unit: FOOT)
}
}
{
empireHero: hero(episode: EMPIRE) {
name
}
}
Reusable units - sets of fields
#define fragment
fragment comparisonFields on Character {
name
appearsIn
friends {
name
}
}
{
leftComparison: hero(episode: EMPIRE) {
...comparisonFields
}
rightComparison: hero(episode: JEDI) {
...comparisonFields
}
}
Named queries can accept a variable parameter
query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
}
}
{
"episode": "JEDI"
}
Default variables can also be set
query HeroNameAndFriends($episode: Episode = "JEDI) {
}
Queries should be named
query QueryName {}
Field conditionals
query Hero($episode: Episode, $withFriends: Boolean!) {
hero(episode: $episode) {
name
friends @include(if: $withFriends) {
name
}
}
}
{
"episode": "JEDI",
"withFriends": false
}
Explicit server-side modifications
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
{
"ep": "JEDI",
"review": {
"stars": 5,
"commentary": "review"
}
}
Define fragments inline
query HeroForEpisode($ep: Episode!) {
hero(episode: $ep) {
name
... on Droid {
primaryFunction
}
}
}
The __typename
metafield return the name of the object type
{
search() {
__typename
}
}
type Character {
name: String!
appearsIn: [Episode]!
}
# !: non-nullable
# []: array
type Starship {
length(unit: LengthUnit = METER): Float
}
No subfields
Int
Float #floating point value
String
Boolean
ID
#custom scalar types
scalar Date
A special kind of scalar
enum Episode {
NEWHOPE
EMPIRE
JEDI
}
interface Character {
id: ID!
name: String!
friends: [Character]
appearsIn: [Episode]!
}
type Human implements Character {
...
}
union SearchResult = Human | Droid | Starship
input ReviewInput {
stars: Int!
commentary: String
}