Louvain
SQL function: cugraph_louvain
Official cuGraph reference: C API
Build a hierarchy of communities by greedily moving vertices and aggregating partitions to maximize modularity.
Signature
cugraph_louvain(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 |
|---|---|---|---|---|
max_level | UInt32 | 100 | min 1 | |
resolution | Float64 | 1 | > 0 | |
threshold | Float64 | 1e-7 | min 0 |
Graph construction options
This function builds an undirected graph by default (directed=false); all other graph construction options follow the shared defaults documented in Graph Construction Options.
Output schema
| Column | Type | Nullable | Description |
|---|---|---|---|
vertex | Int64|Utf8 | no | Vertex assigned to a Louvain community. |
partition | Int64 | no | Community identifier assigned by Louvain. |
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.
Compare citation communities against field labels
Two views select the 2010s AI literature — nodes by field-of-study label,
edges where both endpoints qualify — and Louvain partitions it by citation
structure alone. Cross-tabulating each community against primary_fos (with a
window function to keep the top 3 labels per community) shows how closely the
detected communities align with the assigned labels:
CREATE 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 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;
WITH community_fos AS (
SELECT c."partition" AS community, p.primary_fos, COUNT(*) AS n
FROM cugraph_louvain('ai_edges', 'src', 'dst') c
JOIN papers p ON p.paper_id = c.vertex
GROUP BY c."partition", p.primary_fos),
ranked AS (
SELECT SUM(n) OVER (PARTITION BY community) AS members,
ROW_NUMBER() OVER (PARTITION BY community ORDER BY n DESC) AS rn,
primary_fos,
n
FROM community_fos)
SELECT members, rn, primary_fos, n
FROM ranked
WHERE members > 2500 AND rn <= 3
ORDER BY members DESC, rn;
| members | rn | primary_fos | n |
|---|---|---|---|
| 10,684 | 1 | Convolutional neural network | 3,002 |
| 10,684 | 2 | Object detection | 2,467 |
| 10,684 | 3 | Deep learning | 2,247 |
| 6,707 | 1 | Deep learning | 2,168 |
| 6,707 | 2 | Convolutional neural network | 2,061 |
| 6,707 | 3 | Feature extraction | 778 |
| 5,118 | 1 | Deep learning | 1,591 |
| 5,118 | 2 | Recurrent neural network | 1,289 |
| 5,118 | 3 | Convolutional neural network | 714 |
| 3,960 | 1 | Reinforcement learning | 3,157 |
| 3,960 | 2 | Artificial neural network | 337 |
| 3,960 | 3 | Deep learning | 204 |
Louvain (1,960 communities over 38k papers) recovers recognizable subfield
boundaries: a computer-vision community, a sequence-modeling community, and a
reinforcement-learning community that is 80% one label. Note the quoted
"partition", since the output column name is a SQL keyword. cugraph_leiden
is a drop-in replacement with the same call shape.
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_louvain',
'{"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.