GraphQL

General

Types

type Query {
  me: User
}
 
type User {
  id: ID
  name: String
}

enum Episode {
  NEWHOPE
  EMPIRE
  JEDI
}

type Character {
  # ! means the field is non-nullable
  name: String!
  # this means a non-nullable array of Episode objects
  # which are also non-nullable (so the array can't contain nulls)
  appearsIn: [Episode!]!
  # this means the `friends` array can be null, but it can't contain
  # null values
  friends: [String!]
}

type Starship {
  id: ID!
  name: String!
  # fields can have arguments, optionally with default values
  length(unit: LengthUnit = METER): Float
}

Interfaces

interface Character {
  # any type that implements Character must have at least these fields
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
}

type Human implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  starships: [Starship]
  totalCredits: Int
}
 
type Droid implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  primaryFunction: String
}

Union types

union SearchResult = Human | Droid | Starship

Query and Mutation types

type Query {
  hero(episode: Episode): Character
  droid(id: ID!): Droid
}

query {
  # these are pulled from the type `Query`
  hero {
    name
  }
  droid(id: "2000") {
    name
  }
}

Input types

input ReviewInput {
  stars: Int!
  commentary: String
}

Queries

{
  me {
    name
  }
}
{
  "me": {
    "name": "Luke Skywalker"
  }
}
query YourName {
  me {
    name
  }
}
{
  hero {
    name
    # `friends` is an array of objects, and we want the `name` field
    # from each of those objects
    friends {
      name
    }
  }
}
{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke Skywalker"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia Organa"
        }
      ]
    }
  }
}
{
  human(id: "1000") {
    name
    height(unit: FOOT)
  }
}

Aliases

{
  empireHero: hero(episode: EMPIRE) {
    name
  }
  jediHero: hero(episode: JEDI) {
    name
  }
}
{
  "data": {
    "empireHero": {
      "name": "Luke Skywalker"
    },
    "jediHero": {
      "name": "R2-D2"
    }
  }
}

Fragments

# `hero` is of type Character
{
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields
  }
}

fragment comparisonFields on Character {
  name
  appearsIn
  friends {
    name
  }
}

Inline fragments

query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    name
    ... on Droid {
      primaryFunction
    }
    ... on Human {
      height
    }
  }
}
query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    name
    ...droidFunction
    ...humanHeight
  }
}

fragment droidFunction on Droid {
    primaryFunction
}

fragment humanHeight on Human {
    height
}
query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    name
    # Human and Droid both implement the Character interface
    ... on Character {
      friends
    }
  }
}

Variables

query HeroNameAndFriends($episode: Episode = JEDI) {
  hero(episode: $episode) {
    name
    friends {
      name
    }
  }
}
{
  "episode": "JEDI"
}

Directives

query Hero($episode: Episode, $withFriends: Boolean!, $noHeight: Boolean) {
  hero(episode: $episode) {
    name
    # only include if $withFriends is true
    friends @include(if: $withFriends) {
      name
    }
    # don't include if $noHeight is true
    height @skip(if: $noHeight)
  }
}

Mutations

mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
  createReview(episode: $ep, review: $review) {
    stars
    commentary
  }
}
{
  "ep": "JEDI",
  "review": {
    "stars": 5,
    "commentary": "This is a great movie!"
  }
}
{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}

Meta fields

__typename

{
  search(text: "an") {
    __typename
    ... on Human {
      name
    }
    ... on Droid {
      name
    }
    ... on Starship {
      name
    }
  }
}
{
  "data": {
    "search": [
      {
        "__typename": "Human",
        "name": "Han Solo"
      },
      {
        "__typename": "Human",
        "name": "Leia Organa"
      },
      {
        "__typename": "Starship",
        "name": "TIE Advanced x1"
      }
    ]
  }
}

__schema

{
  __schema {
    types {
      name
    }
  }
}

__type

{
  __type(name: "Droid") {
    name
    fields {
      name
      type {
        name
        kind
        ofType {
          name
          kind
        }
      }
    }
  }
}

Others

Resolver functions

Query: {
  human(obj, args, context, info) {
    return context.db.loadHumanByID(args.id).then(
      userData => new Human(userData)
    )
  }
}

Tools