Skip to main content
HelixQL queries end with a RETURN clause. You can return bindings (variables), projected properties, aggregations, literals, or choose to return nothing at all.

Quick reference

When using the Python SDK, the output values are wrapped in an array for multiple query calls, so you will need to access the first element of the array to get the result of the first call.

Response structure

Every HelixQL response is a JSON object whose top-level keys are the binding names used in RETURN. The value for each key depends on how many elements the binding holds:

Element object shapes

Every element returned by HelixDB includes an id field (a UUID string) alongside its schema-defined properties. Node
Edge — includes from and to fields referencing the connected node IDs, plus any properties defined in the Properties block of the schema.
Vector — includes metadata properties defined in the schema.
When you use property projection (::{ name, age }), only the fields you list are returned — id is not included unless you explicitly request it (e.g. ::{ userID: ::ID, name }). When you use property exclusion (::!{ email }), id is still included because it is not a schema-defined property.

Returning bindings

Return any previously bound value from your traversal.
Returning multiple values creates multiple top-level fields in the response, named after the variables.

Returning projections and properties

Use property projection to shape the returned data.
Return just the ID of each element:
Exclude specific properties:
You can also create nested or remapped shapes in RETURN using nested mappings:
See property access, remappings, and exclusion for more details.

Returning scalars and literals

Aggregations and scalar bindings can be returned directly:
You can also return literals (strings, numbers, booleans) when useful:

Returning nothing

For mutations or maintenance operations where you do not want a response payload, use RETURN NONE.
RETURN NONE signals that the query intentionally produces no output values. This is handy to avoid sending placeholder strings like “success” when a silent acknowledgement is preferred.