Betweenness Centrality
SQL function: cugraph_betweenness_centrality
Official cuGraph reference: C API
Measure how often each vertex lies on shortest paths between other vertex pairs, exactly or from an explicit sample of source vertices.
Signature
cugraph_betweenness_centrality(table_name [, src_col, dst_col [, weight_col [, options_json]]])
Relation inputs
The first positional argument names a registered edge table or view (the edges role). Parenthesized relation subqueries are not accepted; metadata validation uses the same registered name.
Vertex ID types
The edges relation declares the accepted vertex-ID domains. Numeric calls preserve the existing numeric schema. When logical string support is declared, Utf8, LargeUtf8, and Utf8View endpoint columns share one logical domain; their vertex-identity outputs are canonicalized to Utf8.
| Domain | Accepted endpoint inputs | Output contract |
|---|---|---|
| Numeric edge endpoints | Int32, Int64 | The numeric output schema is used for numeric calls. |
| Logical string edge endpoints | Utf8, LargeUtf8, Utf8View | Vertex identity columns are canonicalized to Utf8; scores, distances, counts, coordinates, and opaque labels remain numeric. |
The native mapping type is Int64. Call-specific output schemas come from gpu_validate_call.
Logical string side-input limitations:
- edge ID columns and edge-ID predicate side inputs are not supported for logical string graphs
Scalar arguments & JSON options
Positional scalar arguments
src_col and dst_col name the edge endpoint columns; both are optional and default to src and dst.
| Argument | Type | Required | Default | Notes |
|---|---|---|---|---|
weight_col | Utf8|null | no | accepted as an edge-column binding; native algorithm execution does not consume weights; semantic effect: none for this algorithm |
JSON options
| Option | Type | Default | Constraints | Description |
|---|---|---|---|---|
exact_vertex_threshold | UInt64 | 100000 | Maximum actual graph vertex count allowed for exact betweenness without explicit seeds or k. | |
include_endpoints | Boolean | false | ||
k | UInt64|null | null | min 1; mutually exclusive with seeds | Deterministic approximate seed count. Execution uses the first k distinct graph vertices in stable order and refuses k larger than the actual vertex count. |
normalized | Boolean | true | ||
seeds | List<Int64>|List<Utf8>|null | null | mutually exclusive with k | Explicit homogeneous integer or string seed vertices for approximate betweenness. Null requests exact all-vertex betweenness unless k is set. |
Graph construction options
Graph construction follows the shared defaults (directed=true, renumbering, python_cugraph policy) documented in Graph Construction Options.
Output schema
| Column | Type | Nullable | Description |
|---|---|---|---|
vertex | Int64|Utf8 | no | Algorithm result column. |
value | Float64 | no | Algorithm result column. |
These are generic descriptor schemas; validate the call to get the concrete, table-specific output schema.
Examples
This example runs on the citation network demo dataset.
Exact betweenness on a SQL-defined subgraph
Exact betweenness is refused above exact_vertex_threshold (100k vertices by
default), so the full 4.1M-vertex citation graph needs {"k": N} or explicit
seeds. A WHERE clause is the cleaner instrument: the 2010s AI literature
(same views as the Louvain example)
is a ~38k-vertex graph, small enough that every source is used and the scores
are exact and deterministic — no sampling options required.
CREATE OR REPLACE VIEW ai_nodes AS
SELECT paper_id FROM papers
WHERE year >= 2010 AND primary_fos IN (
'Deep learning', 'Artificial neural network', 'Convolutional neural network',
'Recurrent neural network', 'Natural language processing',
'Reinforcement learning', 'Image segmentation', 'Feature extraction',
'Object detection', 'Speech recognition');
CREATE OR REPLACE VIEW ai_edges AS
SELECT e.src, e.dst
FROM citation_edges e
JOIN ai_nodes a ON a.paper_id = e.src
JOIN ai_nodes b ON b.paper_id = e.dst;
SELECT p.title, p.year, p.primary_fos, CAST(b.value AS BIGINT) AS paths_through
FROM cugraph_betweenness_centrality('ai_edges', 'src', 'dst', NULL,
'{"normalized": false}') b
JOIN papers p ON p.paper_id = b.vertex
ORDER BY b.value DESC
LIMIT 6;
| title | year | primary_fos | paths_through |
|---|---|---|---|
| Deep learning in neural networks | 2015 | Deep learning | 1,107,735 |
| Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation | 2014 | Object detection | 1,053,444 |
| ImageNet Large Scale Visual Recognition Challenge | 2015 | Object detection | 551,882 |
| Squeeze-and-Excitation Networks | 2017 | Convolutional neural network | 535,545 |
| SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size | 2017 | Deep learning | 503,772 |
| Regionlets for Generic Object Detection | 2013 | Object detection | 475,727 |
With normalized: false the score is a raw count: over one million shortest
citation chains inside this subgraph pass through the Deep learning in neural
networks survey and through R-CNN. These are the brokers between AI
subfields — surveys and boundary-crossing architectures — a different signal
than citation volume: none of them is the most-cited paper in the view. The
exact call over the 164k-edge subgraph returns in well under a second.
On the full graph, pass a deterministic sample size instead — execution uses
the first k distinct graph vertices in stable order and refuses k larger
than the actual vertex count:
SELECT * FROM cugraph_betweenness_centrality('citation_edges', 'src', 'dst', NULL,
'{"k": 64, "normalized": false}');
Limitations & lifecycle
No algorithm-specific limitations.
Validate before running
Dry-run validation checks registered relation metadata, column presence, static dtypes, and options only; it does not scan edge data, construct a graph, or prove source-vertex existence:
SELECT * FROM gpu_validate_call(
'cugraph_betweenness_centrality',
'{"schema_version":1,"relations":{"edges":{"table":"target_edges"}},"options":{"src_col":"src","dst_col":"dst"}}'
);
See GPU Function Catalog API for the full gpu_validate_call contract.