Example: Container of Items
Creating the Models
First, create the SDL for your item
type Ball @createModel(accountRelation: LIST, description: "A ball to display") {
  creator: DID! @accountReference
  red: Int
  green: Int
  blue: Int
  radius: Float
}
You will then save this to a file, such as ball.graphql. You can then add the model and get the id.
composedb composite:create --output ball.json ball.graphql cat ball.json | jq '.models | keys_unsorted[0]'
Next, create the SDL for your container, without references to items
type World @createModel(accountRelation: LIST, description: "Ball World") {
  name: String! @string(minLength: 3, maxLength: 50)
}
Save this to a file and add as above. Then we will create a model to relate our item and container
type Ball @loadModel(id: "<id of ball>") {
  id: ID!
}
type World @loadModel(id: "<id of world>"){
  id: ID!
}
type BallRelation @createModel(accountRelation: LIST, description: "Relate a ball to our world") {
  ballID: StreamID! @documentReference(model: "Ball")
  ball: Ball! @relationDocument(property: "ballID")
  worldID: StreamID! @documentReference(model: "World")
  world: World! @relationDocument(property: "worldID")
}
For the relation, the ID will likely be the last model id. Finally, relate our container to our items
type BallRelation @loadModel(id: "<id of ball relation>") {
  id: ID!
}
type World @loadModel(id: "<id of world>") {
  balls: [BallRelation] @relationFrom(model: "BallRelation", property: "worldID")
}
This is a view on top of the models, so you cannot require your items, such as with balls: [BallRelation!]
We can now merge all of these and deploy them as a composite.
composedb composite:merge ball.json world.json ball_relation.json world_relation.json --output=merged.json composedb composite:deploy merged.json composedb composite:compile merged.json runtime.json
Our composite is now ready to use. We can use it with graphiql
composedb graphql:server --graphiql runtime.json
Inserting Data
We can create an item with mutation
mutation CreateNewBall($i: CreateBallInput!){
  createBall(input: $i){
    document {
      id
      radius
    }
  }
}
and variables
{
  "i": {
    "content": {
      "creator": "<some did key>",
      "radius": 45,
      "red": 10,
      "green": 20,
      "blue": 30
    }
  }
}
We can create a container with mutation
mutation CreateNewWorld($i: CreateWorldInput!){
  createWorld(input: $i){
    document {
      id
    }
  }
}
and variables
{
  "i": {
    "content": {
      "name": "test-world",
    }
  }
}
Finally we can define relations between items and the container with mutation
mutation CreateBallRelation($i: CreateBallRelationInput!){
  createBallRelation(input: $i){
    document {
      id
    }
  }
}
and variables
{
  "i": {
    "content": {
      "ballID": "<id from ball mutation>",
      "worldID": "<id from world mutation>"
    }
  }
}
Query The Data
We can query for the container for the items, and from that find the items.
query {
  worldIndex(first: 1) {
    edges {
      node {
        id
        name
        balls(first: 5) {
          edges {
            node {
              id
              ballID
            }
          }
        }
      }
    }
  }
}