All GoogleSQL functions are supported, including the following GQL-specific functions:
Function list Name SummaryDESTINATION_NODE_ID
Gets a unique identifier of a graph edge's destination node. EDGES
Gets the edges in a graph path. The resulting array retains the original order in the graph path. ELEMENT_ID
Gets a graph element's unique identifier. IS_ACYCLIC
Checks if a graph path has a repeating node. IS_FIRST
Returns true
if this row is in the first k
rows (1-based) within the window. IS_SIMPLE
Checks if a graph path is simple. IS_TRAIL
Checks if a graph path has a repeating edge. LABELS
Gets the labels associated with a graph element. NODES
Gets the nodes in a graph path. The resulting array retains the original order in the graph path. PATH
Creates a graph path from a list of graph elements. PATH_FIRST
Gets the first node in a graph path. PATH_LAST
Gets the last node in a graph path. PATH_LENGTH
Gets the number of edges in a graph path. PROPERTY_NAMES
Gets the property names associated with a graph element. SOURCE_NODE_ID
Gets a unique identifier of a graph edge's source node. DESTINATION_NODE_ID
DESTINATION_NODE_ID(edge_element)
Description
Gets a unique identifier of a graph edge's destination node. The unique identifier is only valid for the scope of the query where it's obtained.
Arguments
edge_element
: A GRAPH_ELEMENT
value that represents an edge.Details
Returns NULL
if edge_element
is NULL
.
Return type
STRING
Examples
GRAPH FinGraph
MATCH (:Person)-[o:Owns]->(a:Account)
RETURN a.id AS account_id, DESTINATION_NODE_ID(o) AS destination_node_id
/*------------------------------------------+
|account_id | destination_node_id |
+-----------|------------------------------+
| 7 | mUZpbkdyYXBoLkFjY291bnQAeJEO |
| 16 | mUZpbkdyYXBoLkFjY291bnQAeJEg |
| 20 | mUZpbkdyYXBoLkFjY291bnQAeJEo |
+------------------------------------------*/
Note that the actual identifiers obtained may be different from what's shown above.
EDGES
EDGES(graph_path)
Description
Gets the edges in a graph path. The resulting array retains the original order in the graph path.
Definitions
graph_path
: A GRAPH_PATH
value that represents a graph path.Details
If graph_path
is NULL
, returns NULL
.
Return type
ARRAY<GRAPH_ELEMENT>
Examples
GRAPH FinGraph
MATCH p=(src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET es = EDGES(p)
RETURN ARRAY_CONCAT(ARRAY_TRANSFORM(es, e -> e.Id), [dst.Id]) as ids_in_path
/*-------------+
| ids_in_path |
+-------------+
| [16,20,7] |
+-------------+
| [20,7,16] |
+-------------+
| [20,7,16] |
+-------------+
| [16,20,16] |
+-------------+
| [7,16,20] |
+-------------+
| [7,16,20] |
+-------------+
| [20,16,20] |
+-------------*/
ELEMENT_ID
ELEMENT_ID(element)
Description
Gets a graph element's unique identifier. The unique identifier is only valid for the scope of the query where it's obtained.
Arguments
element
: A GRAPH_ELEMENT
value.Details
Returns NULL
if element
is NULL
.
Return type
STRING
Examples
GRAPH FinGraph
MATCH (p:Person)-[o:Owns]->(:Account)
RETURN p.name AS name, ELEMENT_ID(p) AS node_element_id, ELEMENT_ID(o) AS edge_element_id
/*--------------------------------------------------------------------------------------------------------------------------------------------+
| name | node_element_id | edge_element_id . |
+------|------------------------------|------------------------------------------------------------------------------------------------------+
| Alex | mUZpbkdyYXBoLlBlcnNvbgB4kQI= | mUZpbkdyYXBoLlBlcnNvbk93bkFjY291bnQAeJECkQ6ZRmluR3JhcGguUGVyc29uAHiRAplGaW5HcmFwaC5BY2NvdW50AHiRDg== |
| Dana | mUZpbkdyYXBoLlBlcnNvbgB4kQQ= | mUZpbkdyYXBoLlBlcnNvbk93bkFjY291bnQAeJEGkSCZRmluR3JhcGguUGVyc29uAHiRBplGaW5HcmFwaC5BY2NvdW50AHiRIA== |
| Lee | mUZpbkdyYXBoLlBlcnNvbgB4kQY= | mUZpbkdyYXBoLlBlcnNvbk93bkFjY291bnQAeJEEkSiZRmluR3JhcGguUGVyc29uAHiRBJlGaW5HcmFwaC5BY2NvdW50AHiRKA== |
+--------------------------------------------------------------------------------------------------------------------------------------------*/
Note that the actual identifiers obtained may be different from what's shown above.
IS_ACYCLIC
IS_ACYCLIC(graph_path)
Description
Checks if a graph path has a repeating node. Returns TRUE
if a repetition isn't found, otherwise returns FALSE
.
Definitions
graph_path
: A GRAPH_PATH
value that represents a graph path.Details
Two nodes are considered equal if they compare as equal.
Returns NULL
if graph_path
is NULL
.
Return type
BOOL
Examples
GRAPH FinGraph
MATCH p=(src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
RETURN src.id AS source_account_id, IS_ACYCLIC(p) AS is_acyclic_path
/*-------------------------------------*
| source_account_id | is_acyclic_path |
+-------------------------------------+
| 16 | TRUE |
| 20 | TRUE |
| 20 | TRUE |
| 16 | FALSE |
| 7 | TRUE |
| 7 | TRUE |
| 20 | FALSE |
*-------------------------------------*/
IS_FIRST
IS_FIRST(k)
OVER over_clause
over_clause:
( [ window_specification ] )
window_specification:
[ PARTITION BY partition_expression [, ...] ]
[ ORDER BY expression [ { ASC | DESC } ] [, ...] ]
Description
Returns true
if the current row is in the first k
rows (1-based) in the window; otherwise, returns false
. This function doesn't require the ORDER BY
clause.
Details
k
value must be positive; otherwise, a runtime error is raised.ORDER BY
is omitted, the result is non-deterministic. If the ORDER BY
clause is unspecified or if all rows are tied, the result is equivalent to ANY-k
.Return Type
BOOL
IS_SIMPLE
IS_SIMPLE(graph_path)
Description
Checks if a graph path is simple. Returns TRUE
if the path has no repeated nodes, or if the only repeated nodes are its head and tail. Otherwise, returns FALSE
.
Definitions
graph_path
: A GRAPH_PATH
value that represents a graph path.Details
Returns NULL
if graph_path
is NULL
.
Return type
BOOL
Examples
GRAPH FinGraph
MATCH p=(a1:Account)-[t1:Transfers where t1.amount > 200]->
(a2:Account)-[t2:Transfers where t2.amount > 200]->
(a3:Account)-[t3:Transfers where t3.amount > 100]->(a4:Account)
RETURN
IS_SIMPLE(p) AS is_simple_path,
a1.id as a1_id, a2.id as a2_id, a3.id as a3_id, a4.id as a4_id
/*----------------+-------+-------+-------+-------+
| is_simple_path | a1_id | a2_id | a3_id | a4_id |
+----------------+-------+-------+-------+-------+
| TRUE | 7 | 16 | 20 | 7 |
| TRUE | 16 | 20 | 7 | 16 |
| FALSE | 7 | 16 | 20 | 16 |
| TRUE | 20 | 7 | 16 | 20 |
+----------------+-------+-------+-------+-------*/
IS_TRAIL
IS_TRAIL(graph_path)
Description
Checks if a graph path has a repeating edge. Returns TRUE
if a repetition isn't found, otherwise returns FALSE
.
Definitions
graph_path
: A GRAPH_PATH
value that represents a graph path.Details
Returns NULL
if graph_path
is NULL
.
Return type
BOOL
Examples
GRAPH FinGraph
MATCH
p=(a1:Account)-[t1:Transfers]->(a2:Account)-[t2:Transfers]->
(a3:Account)-[t3:Transfers]->(a4:Account)
WHERE a1.id < a4.id
RETURN
IS_TRAIL(p) AS is_trail_path, t1.id as t1_id, t2.id as t2_id, t3.id as t3_id
/*---------------+-------+-------+-------+
| is_trail_path | t1_id | t2_id | t3_id |
+---------------+-------+-------+-------+
| FALSE | 16 | 20 | 16 |
| TRUE | 7 | 16 | 20 |
| TRUE | 7 | 16 | 20 |
+---------------+-------+-------+-------*/
LABELS
LABELS(element)
Description
Gets the labels associated with a graph element and preserves the original case of each label.
Arguments
element
: A GRAPH_ELEMENT
value that represents the graph element to extract labels from.Details
Returns NULL
if element
is NULL
.
Return type
ARRAY<STRING>
Examples
GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id
/*----------------+
| label | id |
+----------------+
| [Account] | 7 |
| [Account] | 16 |
| [Account] | 20 |
| [Person] | 1 |
| [Person] | 2 |
| [Person] | 3 |
+----------------*/
NODES
NODES(graph_path)
Description
Gets the nodes in a graph path. The resulting array retains the original order in the graph path.
Definitions
graph_path
: A GRAPH_PATH
value that represents a graph path.Details
Returns NULL
if graph_path
is NULL
.
Return type
ARRAY<GRAPH_ELEMENT>
Examples
GRAPH FinGraph
MATCH p=(src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET ns = NODES(p)
RETURN
JSON_QUERY(TO_JSON(ns)[0], '$.labels') AS labels,
JSON_QUERY(TO_JSON(ns)[0], '$.properties.nick_name') AS nick_name;
/*--------------------------------*
| labels | nick_name |
+--------------------------------+
| ["Account"] | "Vacation Fund" |
| ["Account"] | "Rainy Day Fund" |
| ["Account"] | "Rainy Day Fund" |
| ["Account"] | "Rainy Day Fund" |
| ["Account"] | "Vacation Fund" |
| ["Account"] | "Vacation Fund" |
| ["Account"] | "Vacation Fund" |
| ["Account"] | "Rainy Day Fund" |
*--------------------------------*/
PATH
PATH(graph_element[, ...])
Description
Creates a graph path from a list of graph elements.
Definitions
graph_element
: A GRAPH_ELEMENT
value that represents a graph element, such as a node or edge, to add to a graph path.Details
This function produces an error if:
NULL
.Return type
GRAPH_PATH
Examples
GRAPH FinGraph
MATCH (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET p = PATH(src, t1, mid, t2, dst)
RETURN
JSON_QUERY(TO_JSON(p)[0], '$.labels') AS element_a,
JSON_QUERY(TO_JSON(p)[1], '$.labels') AS element_b,
JSON_QUERY(TO_JSON(p)[2], '$.labels') AS element_c
/*-------------------------------------------*
| element_a | element_b | element_c |
+-------------------------------------------+
| ["Account"] | ["Transfers"] | ["Account"] |
| ... | ... | ... |
*-------------------------------------------*/
-- Error: in 'p', a graph element is NULL.
GRAPH FinGraph
MATCH (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET p = PATH(src, NULL, mid, t2, dst)
RETURN TO_JSON(p) AS results
-- Error: in 'p', 'src' and 'mid' are nodes that should be interleaved with an
-- edge.
GRAPH FinGraph
MATCH (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET p = PATH(src, mid, t2, dst)
RETURN TO_JSON(p) AS results
-- Error: in 'p', 't2' is an edge that doesn't connect to a neighboring node on
-- the right.
GRAPH FinGraph
MATCH (src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET p = PATH(src, t2, mid)
RETURN TO_JSON(p) AS results
PATH_FIRST
PATH_FIRST(graph_path)
Description
Gets the first node in a graph path.
Definitions
graph_path
: A GRAPH_PATH
value that represents the graph path to extract the first node from.Details
Returns NULL
if graph_path
is NULL
.
Return type
GRAPH_ELEMENT
Examples
GRAPH FinGraph
MATCH p=(src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET f = PATH_FIRST(p)
RETURN
LABELS(f) AS labels,
f.nick_name AS nick_name;
/*--------------------------*
| labels | nick_name |
+--------------------------+
| Account | Vacation Fund |
| Account | Rainy Day Fund |
| Account | Rainy Day Fund |
| Account | Vacation Fund |
| Account | Vacation Fund |
| Account | Vacation Fund |
| Account | Rainy Day Fund |
*--------------------------*/
PATH_LAST
PATH_LAST(graph_path)
Description
Gets the last node in a graph path.
Definitions
graph_path
: A GRAPH_PATH
value that represents the graph path to extract the last node from.Details
Returns NULL
if graph_path
is NULL
.
Return type
GRAPH_ELEMENT
Examples
GRAPH FinGraph
MATCH p=(src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
LET f = PATH_LAST(p)
RETURN
LABELS(f) AS labels,
f.nick_name AS nick_name;
/*--------------------------*
| labels | nick_name |
+--------------------------+
| Account | Vacation Fund |
| Account | Vacation Fund |
| Account | Vacation Fund |
| Account | Vacation Fund |
| Account | Rainy Day Fund |
| Account | Rainy Day Fund |
| Account | Rainy Day Fund |
*--------------------------*/
PATH_LENGTH
PATH_LENGTH(graph_path)
Description
Gets the number of edges in a graph path.
Definitions
graph_path
: A GRAPH_PATH
value that represents the graph path with the edges to count.Details
Returns NULL
if graph_path
is NULL
.
Return type
INT64
Examples
GRAPH FinGraph
MATCH p=(src:Account)-[t1:Transfers]->(mid:Account)-[t2:Transfers]->(dst:Account)
RETURN PATH_LENGTH(p) AS results
/*---------*
| results |
+---------+
| 2 |
| 2 |
| 2 |
| 2 |
| 2 |
| 2 |
| 2 |
*---------*/
PROPERTY_NAMES
PROPERTY_NAMES(element)
Description
Gets the name of each property associated with a graph element and preserves the original case of each name.
Note: Properties in a graph element are uniquely identified by their names. Properties are case insensitive. Defined properties in the schema always take precedence over dynamic properties when their names conflict. For more information, see dynamic properties definition.Arguments
element
: A GRAPH_ELEMENT
value.Details
Returns NULL
if element
is NULL
.
Return type
ARRAY<STRING>
Examples
GRAPH FinGraph
MATCH (n:Person|Account)
RETURN PROPERTY_NAMES(n) AS property_names, n.id
/*-----------------------------------------------+
| label | id |
+-----------------------------------------------+
| [create_time, id, is_blocked, nick_name] | 7 |
| [create_time, id, is_blocked, nick_name] | 16 |
| [create_time, id, is_blocked, nick_name] | 20 |
| [birthday, city, country, id, name] | 1 |
| [birthday, city, country, id, name] | 2 |
| [birthday, city, country, id, name] | 3 |
+-----------------------------------------------*/
SOURCE_NODE_ID
SOURCE_NODE_ID(edge_element)
Description
Gets a unique identifier of a graph edge's source node. The unique identifier is only valid for the scope of the query where it's obtained.
Arguments
edge_element
: A GRAPH_ELEMENT
value that represents an edge.Details
Returns NULL
if edge_element
is NULL
.
Return type
STRING
Examples
GRAPH FinGraph
MATCH (p:Person)-[o:Owns]->(:Account)
RETURN p.name AS name, SOURCE_NODE_ID(o) AS source_node_id
/*-------------------------------------+
| name | source_node_id |
+------|------------------------------+
| Alex | mUZpbkdyYXBoLlBlcnNvbgB4kQI= |
| Dana | mUZpbkdyYXBoLlBlcnNvbgB4kQQ= |
| Lee | mUZpbkdyYXBoLlBlcnNvbgB4kQY= |
+-------------------------------------*/
Note that the actual identifiers obtained may be different from what's shown above.
Horizontal aggregate function calls in GQLIn GQL, a horizontal aggregate function is an aggregate function that summarizes the contents of exactly one array-typed value. Because a horizontal aggregate function doesn't need to aggregate vertically across rows like a traditional aggregate function, you can use it like a normal function expression. Horizontal aggregates are only allowed in certain syntactic contexts: LET
, FILTER
statements or WHERE
clauses.
Horizontal aggregation is especially useful when paired with a group variable. You can create a group variable inside a quantified path pattern in a linear graph query.
Some aggregates use an ORDER BY
clause, such as the ARRAY_AGG
, STRING_AGG
, and ARRAY_CONCAT_AGG
functions. For these aggregates the system orders inputs by their position in the array if you don't provide an ORDER BY
clause.
LET
, FILTER
statements, or WHERE
clauses only.In the following query, the SUM
function horizontally aggregates over an array (arr
), and then produces the sum of the values in arr
:
GRAPH FinGraph
LET arr = [1, 2, 3]
LET total = SUM(arr)
RETURN total
/*-------+
| total |
+-------+
| 6 |
+-------*/
In the following query, the SUM
function horizontally aggregates over an array of structs (arr
), and then produces the sum of the x
fields in the array:
GRAPH FinGraph
LET arr = [STRUCT(1 as x, 10 as y), STRUCT(2, 9), STRUCT(3, 8)]
LET total = SUM(arr.x)
RETURN total
/*-------+
| total |
+-------+
| 6 |
+-------*/
In the following query, the AVG
function horizontally aggregates over an array of structs (arr
), and then produces the average of the x
and y
fields in the array:
GRAPH FinGraph
LET arr = [STRUCT(1 as x, 10 as y), STRUCT(2, 9), STRUCT(3, 8)]
LET avg_sum = AVG(arr.x + arr.y)
RETURN avg_sum
/*---------+
| avg_sum |
+---------+
| 11 |
+---------*/
The ARRAY_AGG
function can be used as a projection when horizontally aggregating. The resulting array is in the same order as the array that's horizontally aggregated over.
GRAPH FinGraph
LET arr = [STRUCT(1 as x, 9 as y), STRUCT(2, 9), STRUCT(4, 8)]
LET result = ARRAY_AGG(arr.x + arr.y)
RETURN result
/*--------------+
| result |
+--------------+
| [10, 11, 12] |
+--------------*/
The following query produces an error because two arrays were passed into the AVG
aggregate function:
-- ERROR: Horizontal aggregation on more than one array-typed variable
-- isn't allowed
GRAPH FinGraph
LET arr1 = [1, 2, 3]
LET arr2 = [5, 4, 3]
LET avg_val = AVG(arr1 + arr2)
RETURN avg_val
The following query demonstrates a common pitfall. All instances of the array that we're horizontal aggregating over are treated as a single element from that array in the aggregate.
The fix is to lift any expressions that want to use the array as is outside the horizontal aggregation.
-- ERROR: No matching signature for function ARRAY_LENGTH for argument types: INT64
GRAPH FinGraph
LET arr1 = [1, 2, 3]
LET bad_avg_val = SUM(arr1 / ARRAY_LENGTH(arr1))
RETURN bad_avg_val
The fix:
GRAPH FinGraph
LET arr1 = [1, 2, 3]
LET len = ARRAY_LENGTH(arr1)
LET avg_val = SUM(arr1 / len)
RETURN avg_val
In the following query, the COUNT
function counts the unique amount transfers with one to three hops between a source account (src
) and a destination account (dst
):
GRAPH FinGraph
MATCH (src:Account)-[e:Transfers]->{1, 3}(dst:Account)
WHERE src != dst
LET num_transfers = COUNT(e)
LET unique_amount_transfers = COUNT(DISTINCT e.amount)
FILTER unique_amount_transfers != num_transfers
RETURN src.id as src_id, num_transfers, unique_amount_transfers, dst.id AS destination_account_id
/*---------------------------------------------------------------------------+
| src_id | num_transfers | unique_transfers_amount | destination_account_id |
+---------------------------------------------------------------------------+
| 7 | 3 | 2 | 16 |
| 20 | 3 | 2 | 16 |
| 7 | 2 | 1 | 20 |
| 16 | 3 | 2 | 20 |
+---------------------------------------------------------------------------*/
In the following query, the SUM
function takes a group variable called e
that represents an array of transfers, and then sums the amount for each transfer. Note that horizontal aggregation isn't allowed in the RETURN
statement: that ARRAY_AGG
is an aggregate over the result set.
GRAPH FinGraph
MATCH (src:Account {id: 7})-[e:Transfers]->{1,2}(dst:Account)
LET total_amount = SUM(e.amount)
RETURN
src.id AS source_account_id, dst.id AS destination_account_id,
ARRAY_AGG(total_amount) as total_amounts_per_path
/*---------------------------------------------------------------------+
| source_account_id | destination_account_id | total_amounts_per_path |
+---------------------------------------------------------------------+
| 7 | 16 | 300,100 |
| 7 | 20 | 600,400 |
+---------------------------------------------------------------------*/
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4