A DuckDB extension for graph data analytics
Maintainer(s):
habedi
Installing and Loading
INSTALL onager FROM community;
LOAD onager;
Example
-- 1. Check extension version
SELECT onager_version();
-- 2. Create a graph
SELECT onager_create_graph('demo', true);
-- 3. Add nodes and edges
SELECT onager_add_node('demo', 1);
SELECT onager_add_node('demo', 2);
SELECT onager_add_edge('demo', 1, 2, 1.0);
-- 4. Run analytics (e.g., node count)
SELECT onager_node_count('demo');
-- 5. Cleanup
SELECT onager_drop_graph('demo');
About onager
Onager is a graph analytics toolbox for DuckDB. For more information, visit the GitHub repository or the Onager documentation.
Added Functions
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| onager_create_graph | scalar | Create a named graph (0=success) | Returns: integer. Params: (name, directed) | [select onager_create_graph('my_graph', true);] |
| onager_drop_graph | scalar | Delete a named graph | Returns: integer. Params: (name) | [select onager_drop_graph('my_graph');] |
| onager_add_node | scalar | Add a node to graph | Returns: integer. Params: (graph, node_id) | [select onager_add_node('my_graph', 1);] |
| onager_add_edge | scalar | Add a weighted edge | Returns: integer. Params: (graph, src, dst, weight) | [select onager_add_edge('my_graph', 1, 2, 1.0);] |
| onager_list_graphs | scalar | List all graphs (JSON array) | Returns: varchar. Params: () | [select onager_list_graphs();] |
| onager_node_count | scalar | Count nodes in graph | Returns: bigint. Params: (graph) | [select onager_node_count('my_graph');] |
| onager_edge_count | scalar | Count edges in graph | Returns: bigint. Params: (graph) | [select onager_edge_count('my_graph');] |
| onager_node_in_degree | scalar | In-degree of a node | Returns: bigint. Params: (graph, node) | [select onager_node_in_degree('my_graph', 1);] |
| onager_node_out_degree | scalar | Out-degree of a node | Returns: bigint. Params: (graph, node) | [select onager_node_out_degree('my_graph', 1);] |
| onager_ctr_pagerank | table | PageRank centrality | Returns: node_id, rank. Params: (edges [, damping, iterations, directed]) | [select * from onager_ctr_pagerank((select src, dst from edges_table));] |
| onager_ctr_degree | table | Degree centrality | Returns: node_id, in_degree, out_degree. Params: (edges [, directed]) | [select * from onager_ctr_degree((select src, dst from edges_table));] |
| onager_ctr_betweenness | table | Betweenness centrality | Returns: node_id, betweenness. Params: (edges [, normalized]) | [select * from onager_ctr_betweenness((select src, dst from edges_table));] |
| onager_ctr_closeness | table | Closeness centrality | Returns: node_id, closeness. Params: (edges) | [select * from onager_ctr_closeness((select src, dst from edges_table));] |
| onager_ctr_eigenvector | table | Eigenvector centrality | Returns: node_id, eigenvector. Params: (edges [, max_iter, tolerance]) | [select * from onager_ctr_eigenvector((select src, dst from edges_table));] |
| onager_ctr_katz | table | Katz centrality | Returns: node_id, katz. Params: (edges [, alpha, max_iter, tolerance]) | [select * from onager_ctr_katz((select src, dst from edges_table), alpha := 0.1);] |
| onager_ctr_harmonic | table | Harmonic centrality | Returns: node_id, harmonic. Params: (edges) | [select * from onager_ctr_harmonic((select src, dst from edges_table));] |
| onager_ctr_personalized_pagerank | table | Personalized PageRank | Returns: node_id, score. Params: (edges_with_pers_columns [, damping, max_iter, tolerance]) | [select * from onager_ctr_personalized_pagerank((select e.src, e.dst, p.node, p.weight from edges_table e cross join (values (1::bigint, 1.0)) p(node, weight)));] |
| onager_ctr_voterank | table | VoteRank influential spreaders | Returns: node_id. Params: (edges [, num_seeds]) | [select * from onager_ctr_voterank((select src, dst from edges_table), num_seeds := 3);] |
| onager_ctr_local_reaching | table | Local reaching centrality | Returns: node_id, centrality. Params: (edges [, distance]) | [select * from onager_ctr_local_reaching((select src, dst from edges_table), distance := 2);] |
| onager_ctr_laplacian | table | Laplacian centrality | Returns: node_id, centrality. Params: (edges) | [select * from onager_ctr_laplacian((select src, dst from edges_table));] |
| onager_cmm_louvain | table | Louvain modularity optimization | Returns: node_id, community. Params: (edges [, seed]) | [select * from onager_cmm_louvain((select src, dst from edges_table));] |
| onager_cmm_components | table | Connected components | Returns: node_id, component. Params: (edges) | [select * from onager_cmm_components((select src, dst from edges_table));] |
| onager_cmm_label_prop | table | Label propagation | Returns: node_id, label. Params: (edges) | [select * from onager_cmm_label_prop((select src, dst from edges_table));] |
| onager_cmm_girvan_newman | table | Girvan-Newman edge betweenness | Returns: node_id, community. Params: (edges [, communities]) | [select * from onager_cmm_girvan_newman((select src, dst from edges_table), communities := 2);] |
| onager_cmm_spectral | table | Spectral clustering | Returns: node_id, community. Params: (edges [, k, seed]) | [select * from onager_cmm_spectral((select src, dst from edges_table), k := 2);] |
| onager_cmm_infomap | table | Infomap community detection | Returns: node_id, community. Params: (edges [, max_iter, seed]) | [select * from onager_cmm_infomap((select src, dst from edges_table));] |
| onager_lnk_jaccard | table | Jaccard coefficient | Returns: node1, node2, coefficient. Params: (edges) | [select * from onager_lnk_jaccard((select src, dst from edges_table));] |
| onager_lnk_adamic_adar | table | Adamic-Adar index | Returns: node1, node2, score. Params: (edges) | [select * from onager_lnk_adamic_adar((select src, dst from edges_table));] |
| onager_lnk_pref_attach | table | Preferential attachment | Returns: node1, node2, score. Params: (edges) | [select * from onager_lnk_pref_attach((select src, dst from edges_table));] |
| onager_lnk_resource_alloc | table | Resource allocation | Returns: node1, node2, score. Params: (edges) | [select * from onager_lnk_resource_alloc((select src, dst from edges_table));] |
| onager_lnk_common_neighbors | table | Common neighbors count | Returns: node1, node2, count. Params: (edges) | [select * from onager_lnk_common_neighbors((select src, dst from edges_table));] |
| onager_mtr_diameter | table | Graph diameter | Returns: diameter. Params: (edges) | [select * from onager_mtr_diameter((select src, dst from edges_table));] |
| onager_mtr_radius | table | Graph radius | Returns: radius. Params: (edges) | [select * from onager_mtr_radius((select src, dst from edges_table));] |
| onager_mtr_avg_clustering | table | Average clustering coefficient | Returns: avg_clustering. Params: (edges) | [select * from onager_mtr_avg_clustering((select src, dst from edges_table));] |
| onager_mtr_avg_path_length | table | Average shortest path length | Returns: avg_path_length. Params: (edges) | [select * from onager_mtr_avg_path_length((select src, dst from edges_table));] |
| onager_mtr_transitivity | table | Global clustering (transitivity) | Returns: transitivity. Params: (edges) | [select * from onager_mtr_transitivity((select src, dst from edges_table));] |
| onager_mtr_triangles | table | Triangle count per node | Returns: node_id, triangles. Params: (edges) | [select * from onager_mtr_triangles((select src, dst from edges_table));] |
| onager_mtr_assortativity | table | Degree assortativity coefficient | Returns: assortativity. Params: (edges) | [select * from onager_mtr_assortativity((select src, dst from edges_table));] |
| onager_mtr_density | table | Graph density (0 to 1) | Returns: density. Params: (edges [, directed]) | [select * from onager_mtr_density((select src, dst from edges_table));] |
| onager_pth_dijkstra | table | Shortest paths from source | Returns: node_id, distance. Params: (edges [, source]) | [select * from onager_pth_dijkstra((select src, dst from edges_table), source := 1);] |
| onager_pth_bellman_ford | table | Shortest paths (negative weights) | Returns: node_id, distance. Params: (weighted_edges [, source]) | [select * from onager_pth_bellman_ford((select src, dst, weight from edges_table), source := 1);] |
| onager_pth_floyd_warshall | table | All-pairs shortest paths | Returns: src, dst, distance. Params: (weighted_edges) | [select * from onager_pth_floyd_warshall((select src, dst, weight from edges_table));] |
| onager_trv_bfs | table | Breadth-first traversal | Returns: node_id. Params: (edges [, source]) | [select * from onager_trv_bfs((select src, dst from edges_table), source := 1);] |
| onager_trv_dfs | table | Depth-first traversal | Returns: node_id. Params: (edges [, source]) | [select * from onager_trv_dfs((select src, dst from edges_table), source := 1);] |
| onager_apx_max_clique | table | Maximum clique (approximation) | Returns: node_id. Params: (edges) | [select * from onager_apx_max_clique((select src, dst from edges_table));] |
| onager_apx_independent_set | table | Maximum independent set (approx) | Returns: node_id. Params: (edges) | [select * from onager_apx_independent_set((select src, dst from edges_table));] |
| onager_apx_vertex_cover | table | Minimum vertex cover (approx) | Returns: node_id. Params: (edges) | [select * from onager_apx_vertex_cover((select src, dst from edges_table));] |
| onager_apx_tsp | table | TSP tour (greedy approx) | Returns: order, node_id. Params: (weighted_edges) | [select * from onager_apx_tsp((select src, dst, weight from edges_table));] |
| onager_mst_kruskal | table | Kruskal's MST | Returns: src, dst, weight. Params: (weighted_edges) | [select * from onager_mst_kruskal((select src, dst, weight from edges_table));] |
| onager_mst_prim | table | Prims's MST | Returns: src, dst, weight. Params: (weighted_edges) | [select * from onager_mst_prim((select src, dst, weight from edges_table));] |
| onager_gen_erdos_renyi | table | Random graph (G(n,p)) | Returns: src, dst. Params: (n, p [, seed]) | [select * from onager_gen_erdos_renyi(100, 0.1, seed := 42);] |
| onager_gen_barabasi_albert | table | Scale-free graph | Returns: src, dst. Params: (n, m [, seed]) | [select * from onager_gen_barabasi_albert(100, 5, seed := 42);] |
| onager_gen_watts_strogatz | table | Small-world graph | Returns: src, dst. Params: (n, k, beta [, seed]) | [select * from onager_gen_watts_strogatz(100, 4, 0.1, seed := 42);] |
| onager_sub_ego_graph | table | Ego graph around a node | Returns: src, dst. Params: (edges [, center, radius]) | [select * from onager_sub_ego_graph((select src, dst from edges_table), center := 1, radius := 2);] |
| onager_sub_k_hop | table | Nodes within k hops | Returns: node_id. Params: (edges [, start, k]) | [select * from onager_sub_k_hop((select src, dst from edges_table), start := 1, k := 2);] |
| onager_sub_induced | table | Induced subgraph | Returns: src, dst. Params: (edges_with_filter_column) | [select * from onager_sub_induced((select e.src, e.dst, f.node from edges_table e cross join filter_nodes f));] |
| onager_par_pagerank | table | Parallel PageRank | Returns: node_id, rank. Params: (edges [, damping, iterations, directed]) | [select * from onager_par_pagerank((select src, dst from edges_table));] |
| onager_par_bfs | table | Parallel BFS traversal | Returns: node_id. Params: (edges [, source]) | [select * from onager_par_bfs((select src, dst from edges_table), source := 1);] |
| onager_par_shortest_paths | table | Parallel shortest paths | Returns: node_id, distance. Params: (edges [, source]) | [select * from onager_par_shortest_paths((select src, dst from edges_table), source := 1);] |
| onager_par_components | table | Parallel connected components | Returns: node_id, component. Params: (edges) | [select * from onager_par_components((select src, dst from edges_table));] |
| onager_par_clustering | table | Parallel clustering coefficients | Returns: node_id, coefficient. Params: (edges) | [select * from onager_par_clustering((select src, dst from edges_table));] |
| onager_par_triangles | table | Parallel triangle count | Returns: node_id, triangles. Params: (edges) | [select * from onager_par_triangles((select src, dst from edges_table));] |
| onager_version | scalar | Extension version | Returns: varchar. Params: () | [select onager_version();] |
| onager_last_error | scalar | Last error message | Returns: varchar. Params: () | [select onager_last_error();] |
Overloaded Functions
This extension does not add any function overloads.
Added Types
This extension does not add any types.
Added Settings
This extension does not add any settings.