How to Perform Graph Analytics: Centrality and Community Detection in Semantica
Semantica provides two dedicated engines—CentralityCalculator and CommunityDetector—that enable graph analytics with optional NetworkX acceleration for computing node importance scores and detecting community clusters.
The semantica-agi/semantica repository ships with built-in graph analytics capabilities that work out-of-the-box without external dependencies. This guide covers how to compute centrality metrics and run community detection algorithms using the framework's pure-Python implementations, with automatic upgrades to NetworkX-backed performance when available.
Understanding the Centrality Engine
The centrality engine in Semantica measures node importance through multiple well-established graph algorithms. According to the source code in semantica/kg/centrality_calculator.py, the CentralityCalculator class provides a unified interface for degree, betweenness, closeness, eigenvector, and PageRank centrality.
How Centrality Calculation Works
The engine follows a consistent execution pattern across all algorithms:
- NetworkX detection: On initialization, the calculator attempts to import NetworkX and sets
self.use_networkx. When available, calculations delegate to optimized NetworkX implementations. - Fallback mode: Without NetworkX, the engine builds an adjacency list via
_build_adjacencyand runs pure-Python algorithms. - Standardized output: Every method returns a dictionary containing raw scores, sorted rankings, and metadata such as
max_degreeortotal_nodes.
The calculate_all_centrality() helper invokes individual methods sequentially, producing a comprehensive report in a single call.
Computing Multiple Centrality Metrics
from semantica.kg import CentralityCalculator
# Example graph in Semantica's internal format
graph = {
"entities": [{"id": "A"}, {"id": "B"}, {"id": "C"}],
"relationships": [
{"source": "A", "target": "B"},
{"source": "B", "target": "C"},
{"source": "C", "target": "A"},
],
}
calc = CentralityCalculator()
all_centrality = calc.calculate_all_centrality(graph)
print("Degree centrality:", all_centrality["degree"]["centrality"])
print("PageRank:", all_centrality["pagerank"]["centrality"])
Understanding the Community Detection Engine
The community detection engine identifies densely connected subgraphs using multiple algorithmic approaches. As implemented in semantica/kg/community_detector.py, the CommunityDetector class supports Louvain, Leiden, overlapping k-clique, and label propagation methods.
How Community Detection Works
The engine shares architectural patterns with the centrality calculator:
- Algorithm dispatch: The
detect_communities()method routes to concrete implementations based on thealgorithmparameter (also accessible via themethodalias). - NetworkX integration: When available, the engine leverages NetworkX's
greedy_modularity_communities,k_clique_communities, and other optimized algorithms. - Pure-Python fallback: Without NetworkX,
_basic_community_detectionand_basic_overlapping_detectionprovide lightweight greedy heuristics. - Rich results: Output includes community lists, node-to-community mappings, modularity scores, and algorithm metadata.
Additional helpers—calculate_community_metrics() and analyze_community_structure()—expose quality metrics and intra-/inter-community edge statistics.
Running Louvain Community Detection
from semantica.kg import CommunityDetector
detector = CommunityDetector()
result = detector.detect_communities(graph, algorithm="louvain")
print("Found", len(result["communities"]), "communities")
print("Modularity:", result["modularity"])
print("Node assignments:", result["node_assignments"])
Processing Large Graphs with Label Propagation
For graphs exceeding the chunk_size threshold, the engine automatically activates chunked processing to manage memory efficiently:
detector = CommunityDetector()
communities = detector.detect_communities(
graph,
algorithm="label_propagation",
max_iterations=200,
random_seed=42,
chunk_size=5000, # activates chunked mode for >5k nodes
)
print("Communities detected:", len(communities["communities"]))
Combining Centrality and Community Analytics
A common workflow merges node importance scores with community membership for richer insights. The engines' standardized outputs make this straightforward:
# Centrality
centrality = CentralityCalculator().calculate_degree_centrality(graph)
# Communities
communities = CommunityDetector().detect_communities(graph, algorithm="louvain")
# Example: list top-5 high-degree nodes together with their community id
top_nodes = centrality["rankings"][:5]
for entry in top_nodes:
node = entry["node"]
score = entry["score"]
comm_id = communities["node_assignments"].get(node, None)
print(f"Node {node}: degree={score:.3f}, community={comm_id}")
Shared Infrastructure: Adjacency, Logging, and Progress Tracking
Both engines rely on common utilities defined across the Semantica codebase:
| Component | Implementation | Purpose |
|---|---|---|
| Adjacency construction | _build_adjacency() method |
Normalizes any graph representation—dictionaries with relationships arrays, custom objects, or NetworkX graphs—into a simple {node: [neighbors]} map |
| Progress tracking | get_progress_tracker() in semantica/utils/progress_tracker.py |
Creates a singleton tracker; heavy steps wrap with start_tracking() and stop_tracking() |
| Logging | get_logger() in semantica/utils/logging.py |
Supplies module-specific loggers (centrality_calculator or community_detector) for debug and info output |
This shared infrastructure ensures consistent behavior and observability across analytics operations.
Enabling NetworkX Acceleration
The engines function without external dependencies, but installing NetworkX unlocks significant performance gains:
pip install networkx
With NetworkX present, both calculators automatically detect and use optimized C-backed implementations for computationally intensive algorithms like betweenness centrality and Louvain modularity optimization.
Summary
- Two dedicated engines handle graph analytics in Semantica:
CentralityCalculatorfor node importance andCommunityDetectorfor community identification. - Pure-Python with NetworkX boost: Engines work immediately on any installation; add
networkxfor accelerated computation. - Five centrality metrics available: degree, betweenness, closeness, eigenvector, and PageRank via
calculate_all_centrality(). - Four community algorithms supported: Louvain, Leiden, overlapping k-clique, and label propagation through
detect_communities(). - Automatic chunking handles large graphs without manual configuration.
- Shared utilities in
semantica/utils/provide adjacency construction, progress tracking, and structured logging.
Frequently Asked Questions
What graph formats does Semantica accept for analytics?
Semantica's _build_adjacency() method accepts multiple formats: dictionaries with entities and relationships keys (the native format), custom graph objects, or existing NetworkX graphs. The method normalizes all inputs into a simple adjacency list representation.
How do I know if NetworkX acceleration is active?
Both engines set self.use_networkx during initialization. Check this attribute on your calculator or detector instance. The engines also log their mode at debug level through module-specific loggers.
Can I run community detection without NetworkX installed?
Yes. The CommunityDetector falls back to _basic_community_detection() and _basic_overlapping_detection()—lightweight greedy heuristics that produce valid results without external dependencies. NetworkX simply provides faster, more mature implementations.
What is the modularity score returned by community detection?
Modularity measures the quality of a community partition by comparing the density of edges inside communities against a random baseline. Values range from -0.5 to 1, with higher scores indicating stronger community structure. The result["modularity"] field contains this metric when the selected algorithm supports it.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →