All GoogleSQL functions are supported, including the following GQL-specific functions:
Function list
Name | Summary |
---|---|
DESTINATION_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
: AGRAPH_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
: AGRAPH_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
: AGRAPH_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
: AGRAPH_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
- The
k
value must be positive; otherwise, a runtime error is raised. - If any rows are tied or if
ORDER BY
is omitted, the result is non-deterministic. If theORDER BY
clause is unspecified or if all rows are tied, the result is equivalent toANY-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
: AGRAPH_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
: AGRAPH_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
: AGRAPH_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
: AGRAPH_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
: AGRAPH_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:
- A graph element is
NULL
. - Nodes aren't interleaved with edges.
- An edge doesn't connect to neighboring nodes.
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
: AGRAPH_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
: AGRAPH_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
: AGRAPH_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.
Arguments
element
: AGRAPH_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
: AGRAPH_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.
Supplemental materials
Horizontal aggregate function calls in GQL
In 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.
Syntactic restrictions
- The argument to the aggregate function must reference exactly one array-typed value.
- Can be used in
LET
,FILTER
statements, orWHERE
clauses only. - Nesting horizontal aggregates isn't allowed.
Examples
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 | +---------------------------------------------------------------------*/