📖 Scenario: You are building a simple search feature for a small online library. The library has two types of items: Books and Authors. Users want to search for a keyword that can match either a book title or an author name.
🎯 Goal: Create a GraphQL query that searches across both Book and Author types using a single search keyword. The query should return matching books with their title and year, and matching authors with their name and birthYear.
📋 What You'll Learn
Define GraphQL types Book and Author with specified fields
Create a SearchResult union type combining Book and Author
Write a search query that accepts a keyword argument
Return a list of SearchResult matching the keyword in either book titles or author names
Use inline fragments to select fields specific to Book and Author
💡 Why This Matters
🌍 Real World
Many applications need to search across different types of data, like books and authors, products and categories, or users and posts. This project shows how to do that in GraphQL.
💼 Career
Understanding how to use union types and inline fragments in GraphQL is important for building flexible APIs that serve complex search and filtering needs.
Progress0 / 4 steps
1
Define Book and Author Types
Define a GraphQL Book type with fields title (String) and year (Int). Also define an Author type with fields name (String) and birthYear (Int).
GraphQL
Hint
Use type keyword to define each type and list the fields with their types.
2
Create SearchResult Union Type
Create a GraphQL union type called SearchResult that combines the Book and Author types.
GraphQL
Hint
Use the union keyword followed by the union name and the types separated by |.
3
Add Search Query with Keyword Argument
Add a search query to the Query type. It should accept a keyword argument of type String! and return a list of SearchResult.
GraphQL
Hint
Define the Query type and add the search field with the correct argument and return type.
4
Write Search Query with Inline Fragments
Write a GraphQL query named SearchQuery that calls the search query with a variable $keyword of type String!. Use inline fragments to select title and year for Book, and name and birthYear for Author.
GraphQL
Hint
Use query keyword with variable declaration. Use inline fragments ... on TypeName to select fields for each type.
Practice
(1/5)
1. What does the __typename field do in a GraphQL query when searching across types?
easy
A. It tells you the type of each returned object in the result.
B. It filters the results to only one type.
C. It sorts the results alphabetically.
D. It limits the number of results returned.
Solution
Step 1: Understand the role of __typename
The __typename field returns the name of the type of each object in the query result.
Step 2: Differentiate from other options
It does not filter, sort, or limit results; it only identifies the type.
Final Answer:
It tells you the type of each returned object in the result. -> Option A
Quick Check:
__typename shows object type [OK]
Hint: Remember: __typename reveals object type, not filters or limits [OK]
Common Mistakes:
Thinking __typename filters results
Assuming it sorts or limits data
Confusing it with field selection
2. Which of the following is the correct syntax to query two different types, Book and Author, in one GraphQL query using fragments?
easy
A. query { search { ... on Book { title } ... on Author { name } } }
B. query { search { Book { title } Author { name } } }
C. query { search { title, name } }
D. query { search { ...Book { title } ...Author { name } } }
Solution
Step 1: Recognize fragment syntax for multiple types
Fragments use ... on TypeName { fields } to specify fields for each type.
Step 2: Check each option's syntax
query { search { ... on Book { title } ... on Author { name } } } correctly uses inline fragments for Book and Author. Options B, C, and D have invalid syntax.
Final Answer:
query { search { ... on Book { title } ... on Author { name } } } -> Option A
Quick Check:
Fragments use ... on Type [OK]
Hint: Use ... on Type for each type's fields [OK]
Common Mistakes:
Using type names as fields directly
Omitting 'on' keyword in fragments
Trying to list fields without fragments
3. Given this GraphQL query:
query { search { __typename ... on Book { title author } ... on Author { name booksCount } } }
What will be the output if the search returns one Book and one Author?
Hint: Look for __typename and matching fields in output [OK]
Common Mistakes:
Ignoring __typename in output
Mixing fields between types
Assuming syntax errors without cause
4. Identify the error in this GraphQL query that searches across types:
query { search { ... on Book { title author } ... on Author { name booksCount } } }
Assuming booksCount is not a valid field on Author type.
medium
A. The query will ignore the Author fragment entirely.
B. The query will succeed but return null for booksCount.
C. The query will fail because booksCount is not a valid field on Author.
D. The query syntax is invalid due to missing commas.
Solution
Step 1: Check field validity on types
Since booksCount is not defined on Author, the query is invalid.
Step 2: Understand GraphQL error handling
GraphQL returns an error and fails the query if a requested field does not exist on the type.
Final Answer:
The query will fail because booksCount is not a valid field on Author. -> Option C
Quick Check:
Invalid field causes query failure [OK]
Hint: Check if all fields exist on their types before querying [OK]
Common Mistakes:
Assuming invalid fields return null
Ignoring GraphQL schema validation errors
Thinking commas are required between fragments
5. You want to search across three types: Book, Author, and Publisher. Each type has a field name, but Book also has pages, Author has birthYear, and Publisher has location. Which query correctly fetches the name for all types and their specific fields?
hard
A. query { search { ...Book { name pages } ...Author { name birthYear } ...Publisher { name location } } }
B. query { search { name pages birthYear location } }
C. query { search { __typename { name } ... on Book { pages } ... on Author { birthYear } ... on Publisher { location } } }
D. query { search { __typename ... on Book { name pages } ... on Author { name birthYear } ... on Publisher { name location } } }
Solution
Step 1: Use __typename to identify each type
This helps distinguish which object is which type in the results.
Step 2: Use inline fragments with ... on Type syntax
Each fragment fetches the common name and the type-specific fields.
Step 3: Verify syntax correctness
query { search { __typename ... on Book { name pages } ... on Author { name birthYear } ... on Publisher { name location } } } correctly uses fragments and includes __typename. Other options have syntax errors or missing fragments.
Final Answer:
query { search { __typename ... on Book { name pages } ... on Author { name birthYear } ... on Publisher { name location } } } -> Option D
Quick Check:
Fragments + __typename fetch all fields correctly [OK]
Hint: Use __typename and fragments for each type's fields [OK]
Common Mistakes:
Listing all fields without fragments
Omitting __typename for type identification
Incorrect fragment syntax without 'on'
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.