RETURN

In the RETURN part of your query, you define which parts of the pattern you are interested in. It can be nodes, relationships, or properties on these.

Return nodes

To return a node, list it in the RETURN statement.

Query

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'B'})
    RETURN n
$$) as (n agtype);

The example will return the node.

Result

n
{id: 0; label: ‘’ properties: {name: ‘B’}}::vertex
(1 row)

Return edges

To return n edge, just include it in the RETURN list.

Query

SELECT *
FROM cypher('graph_name', $$
    MATCH (n)-[r:KNOWS]->()
    WHERE n.name = 'A'
    RETURN r
$$) as (r agtype);

The relationship is returned by the example.

r
{id: 2; startid: 0; endid: 1; label: ‘KNOWS’ properties: {}}::edge
(1 row)

Return property

To return a property, use the dot separator, like this:

Query

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})
    RETURN n.name
$$) as (name agtype);

The value of the property name gets returned.

Result

name
‘A’
(1 row)

Return all elements

When you want to return all vertices, edges and paths found in a query, you can use the * symbol.

Query

SELECT *
FROM cypher('graph_name', $$
	MATCH (a {name: 'A'})-[r]->(b)
	RETURN *
$$) as (a agtype, b agtype, r agtype);

This returns the two vertices, and the edge used in the query.

Result

a b r
{"id": 281474976710659, "label": "", "properties": {"age": 55, "name": "A", "happy": "Yes!"}}::vertex {"id": 1125899906842625, "label": "BLOCKS", "end_id": 281474976710660, "start_id": 281474976710659, "properties": {}}::edge {"id": 281474976710660, "label": "", "properties": {"name": "B"}}::vertex
{"id": 281474976710659, "label": "", "properties": {"age": 55, "name": "A", "happy": "Yes!"}}::vertex {"id": 1407374883553281, "label": "KNOWS", "end_id": 281474976710660, "start_id": 281474976710659, "properties": {}}::edge {"id": 281474976710660, "label": "", "properties": {"name": "B"}}::vertex
(2 rows)

Variable with uncommon characters

To introduce a placeholder that is made up of characters that are not contained in the English alphabet, you can use the ` to enclose the variable, like this:

Query

SELECT *
FROM cypher('graph_name', $$
    MATCH (`This isn\'t a common variable`)
    WHERE `This isn\'t a common variable`.name = 'A'
    RETURN `This isn\'t a common variable`.happy
$$) as (happy agtype);

The node with name “A” is returned.

Result

happy
"Yes!"
(1 row)

Aliasing a field

If the name of the field should be different from the expression used, you can rename it by changing the name in the column list definition.

Query

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})
    RETURN n.name
$$) as (objects_name agtype);

Returns the age property of a node, but renames the field.

Result

objects_name
‘A’
(1 row)

Optional properties

If a property might or might not be there, you can still select it as usual. It will be treated as null if it is missing.

Query

SELECT *
FROM cypher('graph_name', $$
    MATCH (n)
    RETURN n.age
$$) as (age agtype);

This example returns the age when the node has that property, or null if the property is not there.

Result

age
55
NULL
(2 rows)

Other expressions

Any expression can be used as a return item—literals, predicates, properties, functions, and everything else.

Query

SELECT *
FROM cypher('graph_name', $$
    MATCH (a)
    RETURN a.age > 30, 'I'm a literal', id(a)
$$) as (older_than_30 agtype, literal agtype, id agtype);

Returns a predicate, a literal and function call with a pattern expression parameter.

Result

older_than_30 literal id
true ‘I’m a literal’ 1
(1 row)

Unique results

DISTINCT retrieves only unique records depending on the fields that have been selected to output.

Query

SELECT *
FROM cypher('graph_name', $$
MATCH (a {name: 'A'})-[]->(b)
RETURN DISTINCT b
$$) as (b agtype);

The node named “B” is returned by the query, but only once.

Result

b
{id: 1; label: ‘’ properties: {name: ‘B’}}::vertex
(1 row)