directive @core(feature: String!) repeatable on SCHEMA directive @join__owner(graph: join__Graph!) on OBJECT directive @join__type( graph: join__Graph! key: String! resolvable: Boolean = true ) repeatable on OBJECT | INTERFACE directive @join__field( graph: join__Graph requires: String provides: String ) on FIELD_DEFINITION directive @join__graph(name: String!, url: String!) on ENUM_VALUE enum join__Graph { FOREST @join__graph(name: "forest", url: "http://example.com/forest") MANGROVE @join__graph(name: "mangrove", url: "http://example.com/mangrove") SAVANA @join__graph(name: "savana", url: "http://example.com/savana") STEPPE @join__graph(name: "steppe", url: "http://example.com/steppe") } type Squirrel { favouriteFood: String @join__field(graph: FOREST) } type Cheetah implements Animal @join__type(graph: MANGROVE, key: "species") @join__type(graph: SAVANA, key: "species") { favouriteFood: String @join__field(graph: FOREST) runSpeedKmh: Float @join__field(graph: MANGROVE) species: String! swimSpeedKmh: Float @join__field(graph: MANGROVE) topSpeed: Int! @join__field(graph: SAVANA) weightGrams: Int @join__field(graph: STEPPE) } type Mammoth { tuskLength: Int @join__field(graph: STEPPE) weightGrams: Int @join__field(graph: STEPPE) } type Query { getMammoth: Mammoth @join__field(graph: STEPPE) } interface Animal @join__type(graph: MANGROVE, key: "species") @join__type(graph: FOREST, key: "species", isInterfaceObject: true) @join__type(graph: STEPPE, key: "species", isInterfaceObject: true) { favouriteFood: String @join__field(graph: FOREST) species: String! swimSpeedKmh: Float @join__field(graph: MANGROVE) weightGrams: Int @join__field(graph: STEPPE) }