graph
analytics.bfs
Run a bounded breadth-first traversal.
strata graph bfsdb.graphs.analytics.bfs(graph: 'str', start: 'str', *, direction: 'Optional[str]' = None, edge_types: 'Optional[list]' = None, max_depth: 'Optional[int]' = None, max_nodes: 'Optional[int]' = None, budget: 'Optional[dict]' = None, as_of: 'Optional[int]' = None, as_of_time: 'Optional[TimeLike]' = None) -> 'Any'wire graph_bfs
Runs a breadth-first traversal from a start node over a consistent snapshot, bounded by `max_depth` (default 100) and `max_nodes` (default 10000). Returns visited node ids in traversal order, a depth per node, and the tree edges in discovery order. Direction defaults to `outgoing`; an optional edge-type list restricts every hop. The start node must exist (`not_found.engine.graph_node`).
Analytics commands compute over a consistent snapshot of the visible graph and return a complete result payload in one response. They accept optional snapshot budgets and an `as_of` timestamp for time travel; results are deterministic for a fixed graph state.
To see the complete help for this command, run:
strata graph bfs --helphelp(db.graphs.analytics.bfs)
Example
Breadth-first traversal from a start node.
strata graph create gstrata graph add-node g astrata graph add-node g bstrata graph add-node g cstrata graph add-edge g a knows bstrata graph add-edge g b knows cstrata graph bfs g a
_ = db.graphs.create("g")_ = db.graphs.add_node("g", "a")_ = db.graphs.add_node("g", "b")_ = db.graphs.add_node("g", "c")_ = db.graphs.add_edge("g", "a", "knows", "b")_ = db.graphs.add_edge("g", "b", "knows", "c")db.graphs.analytics.bfs("g", "a").visited
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| graph | string | yes | Graph name. |
| start | string | yes | Start node id. |
| as_of | integer or null | no | Read as of a position on the logical commit timeline - the `timestamp` from `history` output, not the `version`, and never a calendar date. Reads the graph state visible at that timeline position. To read as of a real time, use `as_of_time` instead. |
| as_of_time | integer or null | no | Read as of a real time: a wall-clock instant in microseconds since the Unix epoch (UTC), as reported by `committed_at` on a write ack or on any `history` row. Resolves to the commit at or before that instant, and fails rather than guessing if the instant falls outside the branch's recorded history. Mutually exclusive with `as_of`. |
| branch | string or null | no | Target branch. Defaults to the executor handle branch. |
| budget | any | no | Optional snapshot size bounds. Defaults to the engine limits. |
| direction | any | no | Optional traversal direction. Defaults to outgoing. |
| edge_types | array or null | no | Optional edge-type restriction applied at every hop. |
| max_depth | integer or null | no | Optional depth bound. Defaults to 100. |
| max_nodes | integer or null | no | Optional visited-node bound. Defaults to 10000. |
| space | string or null | no | Target product space. Defaults to `"default"`. |
Returns
AnalyticsResult<GraphBfsData>
- dataGraphBfsData
- typestring
Errors
Recover by code. Retry policy and commit outcome come from the shipped error registry.
| Code | Retry | Commit outcome |
|---|---|---|
| failed_precondition.engine.runtime_closed | never | not_started |
| not_found.engine.branch | never | not_applicable |
| invalid_argument.engine.product_space | never | not_started |
| invalid_argument.engine.graph_name | never | not_started |
| not_found.engine.graph | never | not_applicable |
| invalid_argument.engine.graph_node_id | never | not_started |
| invalid_argument.engine.graph_edge_type | never | not_started |
| not_found.engine.graph_node | never | not_applicable |
| resource_exhausted.engine.graph_analytics_budget | after_state_change | not_applicable |
| invalid_argument.executor.graph_analytics_budget | never | not_started |