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) |