# Graph Store > **Unified interface for Property Graph Databases (Neo4j, KuzuDB, FalkorDB).** --- ## 🎯 Overview
- :material-database-search:{ .lg .middle } **Multi-Backend** --- Support for Neo4j (Enterprise), KuzuDB (Embedded), and FalkorDB (Redis-based) - :material-code-braces:{ .lg .middle } **Cypher Support** --- Execute standard Cypher queries across all supported backends - :material-graph:{ .lg .middle } **Graph Algorithms** --- Built-in support for PageRank, Community Detection, and Path Finding - :material-flash:{ .lg .middle } **Bulk Loading** --- Optimized batch processing for high-speed data ingestion - :material-lock:{ .lg .middle } **Transactions** --- ACID transaction support with rollback capabilities - :material-chart-bell-curve:{ .lg .middle } **Analytics** --- Centrality, Similarity, and Connectivity analysis
!!! tip "When to Use" - **Persistent Storage**: Storing the Knowledge Graph for long-term access - **Complex Queries**: Running multi-hop pattern matching queries - **Graph Analytics**: Performing global analysis on the graph structure - **Production**: Scaling to billions of nodes/edges (Neo4j/FalkorDB) --- ## ⚙️ Algorithms Used ### Query Execution - **Cypher Translation**: Adapting queries for specific backend nuances (though most support OpenCypher). - **Query Optimization**: Index utilization and execution plan analysis. ### Graph Analytics - **PageRank**: Measuring node importance based on incoming links. - **Louvain Modularity**: Detecting communities by optimizing modularity. - **Shortest Path**: Dijkstra/A* for finding optimal routes. - **Jaccard Similarity**: Measuring node similarity based on shared neighbors. ### Bulk Operations - **Chunking**: Splitting large datasets into optimal batch sizes (e.g., 5000 records) to prevent memory overflow. - **Parallel Loading**: Concurrent batch insertion (backend dependent). --- ## Main Classes ### GraphStore The main facade for graph operations. **Methods:** | Method | Description | |--------|-------------| | `execute_query(query, params)` | Run Cypher query | | `create_node(labels, props)` | Add node | | `create_relationship(start, end, type)` | Add edge | **Example:** ```python from semantica.graph_store import GraphStore store = GraphStore(backend="neo4j") store.execute_query( "MATCH (n:Person {name: $name}) RETURN n", params={"name": "Alice"} ) ``` ### Neo4jAdapter Enterprise-grade backend. **Features:** - Bolt protocol support - Cluster awareness - APOC procedure integration ### KuzuAdapter Embedded, in-process backend. **Features:** - No external server required - Columnar storage for speed - Zero-copy integration with Arrow ### FalkorDBAdapter High-performance Redis module. **Features:** - Sparse matrix representation - Ultra-low latency - Redis protocol --- ## Convenience Functions ```python from semantica.graph_store import execute_query, create_node # Quick query results = execute_query("MATCH (n) RETURN count(n) as count") # Quick node creation create_node(["Person"], {"name": "Bob"}) ``` --- ## Configuration ### Environment Variables ```bash export GRAPH_STORE_BACKEND=neo4j export NEO4J_URI=bolt://localhost:7687 export NEO4J_USER=neo4j export NEO4J_PASSWORD=password ``` ### YAML Configuration ```yaml graph_store: backend: neo4j neo4j: uri: bolt://localhost:7687 pool_size: 50 kuzu: path: ./data/kuzu_db buffer_pool_size: 1024 # MB ``` --- ## Integration Examples ### Hybrid Search (Vector + Graph) ```python from semantica.graph_store import GraphStore from semantica.vector_store import VectorStore # 1. Find relevant nodes via Vector Search vector_store = VectorStore() results = vector_store.search(query_vec, k=5) node_ids = [r.metadata['node_id'] for r in results] # 2. Expand context via Graph Traversal graph_store = GraphStore() query = """ MATCH (n)-[r]-(m) WHERE elementId(n) IN $ids RETURN n, r, m """ subgraph = graph_store.execute_query(query, params={"ids": node_ids}) ``` --- ## Best Practices 1. **Use Parameters**: Always use parameters in Cypher queries (`$name`) instead of string concatenation to prevent injection and improve caching. 2. **Batch Writes**: Use `create_nodes` (plural) for bulk insertion instead of loop-inserting. 3. **Create Indexes**: Ensure you have indexes on frequently queried properties (`id`, `name`). 4. **Close Connections**: Use context managers (`with GraphStore() as store:`) or call `close()` to release resources. --- ## See Also - [Knowledge Graph Module](kg.md) - Logical layer above Graph Store - [Triple Store Module](triple_store.md) - RDF-based alternative - [Visualization Module](visualization.md) - Visualizing query results