GFQL RETURN (Row Pipelines)#
Use row-pipeline operators for Cypher-style MATCH … RETURN flows after pattern matching.
Scope#
This page covers row-table operations: rows, where_rows, with_, return_, select, order_by, skip, limit, distinct, unwind, group_by.
For same-path MATCH constraints, use GFQL WHERE (Same-Path Constraints) (where=[…]).
Minimal Example#
from graphistry import n, e_forward, gt
from graphistry.compute import rows, where_rows, return_, order_by, limit
top_people = g.gfql([
n({"type": "Person"}),
e_forward({"type": "FOLLOWS"}),
n({"type": "Person", "score": gt(0)}, name="p"),
rows(table="nodes", source="p"),
where_rows(expr="score >= 50"),
return_(["id", "name", "score"]),
order_by([("score", "desc"), ("name", "asc")]),
limit(10),
])
Key Semantics#
rows(table=”nodes” or table=”edges”, source=”alias”) selects the active row table.
source must reference a prior matcher alias from name=”…”.
where_rows(…) filters the active row table (not chain aliases).
return_, with_, and select use the same projection shape.
rows(table=…, source=…) in practice#
from graphistry import n, e_forward
from graphistry.compute import rows, return_, order_by
# Node rows matched by alias "p"
people_rows = g.gfql([
n({"type": "Person"}, name="p"),
e_forward(name="r"),
n(name="q"),
rows(table="nodes", source="p"),
return_(["id", "name", "score"]),
order_by([("id", "asc")]),
])
# Edge rows matched by alias "r"
edge_rows = g.gfql([
n(name="a"),
e_forward({"type": "FOLLOWS"}, name="r"),
n(name="b"),
rows(table="edges", source="r"),
return_(["s", "d", "type", "weight"]),
])
table=”nodes” switches to node rows; table=”edges” switches to edge rows.
source=”p” (or “r”) keeps only rows participating in that named matcher.
If source is omitted (rows(table=”nodes”)), the full active table is used.
For edge rows, replace s/d with your graph’s configured edge endpoint column names.
where_rows(expr=”…”): expression language#
from graphistry import n
from graphistry.compute import rows, where_rows, return_
filtered = g.gfql([
n({"type": "Person"}, name="p"),
rows(table="nodes", source="p"),
where_rows(expr="score >= 50 AND name STARTS WITH 'A' AND manager_id IS NOT NULL"),
return_(["id", "name", "score", "manager_id"]),
])
expr uses the GFQL row-expression parser (Cypher-like subset).
Columns are referenced by active row-table column name (for example, score, name).
Common operators: AND, OR, NOT, =, !=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, IN, CONTAINS, STARTS WITH, ENDS WITH.
For predicate helpers like lt(…)/between(…), use where_rows(filter_dict=…).
Unsupported row expressions are rejected by validator/runtime.
with_, select, return_: same projection model#
from graphistry import n
from graphistry.compute import rows, with_, where_rows, return_
ranked = g.gfql([
n({"type": "Person"}, name="p"),
rows(table="nodes", source="p"),
with_([
"id", # shorthand for ("id", "id")
("score2", "score * 2"), # tuple is (output_name, expression)
("person_name", "name"), # rename
]),
where_rows(expr="score2 >= 100"),
return_(["id", "person_name", "score2"]),
])
from graphistry import n
from graphistry.compute import rows, select
projected = g.gfql([
n({"type": "Person"}, name="p"),
rows(table="nodes", source="p"),
select([
("person_id", "id"),
("score2", "score * 2"),
]),
])
with_(…), select(…), and return_(…) all accept:
Shorthand string: “col” means ( “col”, “col” ).
Tuple form: (output_name, expression_or_source_column).
Mixed lists of shorthand + tuples.
Notes#
return_([“id”]) is shorthand for return_([(“id”, “id”)]).
Multiple projection steps are allowed and applied left-to-right: return_(…), with_(…), and select(…) each project from the current active row table produced by prior steps. Later projections can only reference columns that still exist after earlier projections.
order_by([(“col”, “asc” | “desc”)]) sorts by one or more keys.
skip(n) and limit(n) are row offsets/caps.
In where_rows(expr=”…”), comparison operators are =, !=, <>, <, <=, >, >=.
For temporal/date-time row filtering, where_rows(filter_dict=…) uses the same predicate operators as MATCH filters (gt, ge, lt, le, eq, ne, between).
Call-step placement rule: row-pipeline calls (rows, where_rows, return_, with_, select, order_by, skip, limit, distinct, unwind, group_by) are chain-list steps. Do not interleave call steps with n()/e() traversals in the chain interior; place calls in boundary prefix/suffix segments around traversal steps.
Unsupported row expressions are rejected by validator/runtime.
See also: GFQL Quick Reference, GFQL WHERE (Same-Path Constraints), Cypher to GFQL Python & Wire Protocol Mapping.