Objects

Object types have fields that may be other object types or scalar types. Object types allow you to define the truly custom data types and relations that make up your application.

You could model a user with blog posts like so:

type User {
    id: ID!
    username: String!
    blogPosts: [BlogPost!]! @relation(name: "User:blogPosts and BlogPost:author")
}

type BlogPost {
    id: ID!
    publishedAt: Date
    title: String!
    author: User! @relation(name: "User:blogPosts and BlogPost:author")
}

You could model a family tree like so:

type Person {
    id: ID!
    firstName: String!
    lastName: String!
    father: Person @relation(name: "Person:father and Person:children")
    mother: Person @relation(name: "Person:mother and Person:children")
    children: [Person!]!
        @relation(name: "Person:father and Person:children")
        @relation(name: "Person:mother and Person:children")
}

TODO the example above will not work yet

TODO the self-referencing has some issues and multiple @relation directives per field is not yet supported

You could model Ethereum block data like so:

type Block {
    id: ID!
    number: Int!
    hash: String!
    parent: Block
    transactionsRoot: String!
    transactionCount: Int!
    stateRoot: String!
    gasLimit: String!
    gasUsed: String!
    timestamp: Date!
    transactions: [Transaction!]! @relation(name: "Block:transactions and Transaction:block")
}

type Transaction {
    id: ID!
    hash: String!
    index: Int!
    from: String!
    to: String!
    value: String!
    gasPrice: String!
    gas: String!
    inputData: String!
    block: Block! @relation(name: "Block:transactions and Transaction:block")
    gasUsed: String!
}