Using GraphQL Interface And Union Types
Overview
This page describes how interface and union types can be used with neo4j-graphql.js.
GraphQL supports two kinds of abstract types: interfaces and unions. Interfaces are abstract types that include a set of fields that all implementing types must include. A union type indicates that a field can return one of several object types, but doesn't specify any fields that must be included in the implementing types of the union. See the GraphQL documentation to learn more about interface and union types.
Interface Types
Interface types are supported in neo4j-graphql.js through the use of multiple labels in Neo4j. For example, consider the following GraphQL type definitions:
The above GraphQL type definitions would define the following property graph model using neo4j-graphql.js:

Note that the label Person
(which represents the interface type) is added to each node of a type implementing the Person
interface (User
and Actor
),
Interface Mutations
When an interface type is included in the GraphQL type definitions, the generated create mutations will add the additional label for the interface type to any nodes of an implementing type when creating data. For example consider the following mutations.
This creates the following graph in Neo4j (note the use of multiple labels):

Interface Queries
Query field
A query field is added to the generated Query
type for each interface. For example, querying using our Person
interface.
__typename introspection field
The __typename
introspection field can be added to the selection set to determine the concrete type of the object.
Inline fragments
Inline fragments can be used to access fields of the concrete types in the selection set.
Filtering With Interfaces
The generated filter arguments can be used for interface types. Note however that only fields in the interface definition are included in the generated filter arguments as those apply to all concrete types.
Interface Relationship Fields
We can also use interfaces when defining relationship fields. For example:
Union Types
Note that using union types for relationship types is not yet supported by neo4j-graphql.js. Unions can however be used on relationship fields.
Union types are abstract types that do not specify any fields that must be included in the implementing types of the union, therefore it cannot be assumed that the concrete types of a union include any overlapping fields. Similar to interface types, in neo4j-graphql.js an additional label is added to nodes to represent the union type.
For example, consider the following GraphQL type definitions:
Union Mutations
Using the generated mutations to create the following data:
The above mutations create the following data in Neo4j. Note the use of multiple node labels.

Union Queries
Query Field
A query field is added to the Query type for each union type defined in the schema.
Inline Fragments
Inline fragments are used in the selection set to access fields of the concrete type.
Using With @cypher Directive Query Fields
We can also use unions with @cypher
directive fields. Unions are often useful in the context of search results, where the result object might be one of several types. In order to support this usecase full text indexes can be used to search across multiple node labels and properties.
First, let's create a full text index in Neo4j. This index will include the :Blog(content)
and :Movie(title)
properties.
Now we can add a search
field to the Query type that searches the full text index.
Now we can query the search
field, leveraging the full text index.
Resources
- Using Neo4j’s Full-Text Search With GraphQL -- Defining Custom Query Fields Using The Cypher GraphQL Schema Directive