Graph Database

Nucleus includes a native property graph engine with Cypher query support, graph algorithms, and CSR-optimized traversals — no separate graph database needed.

Creating Nodes & Edges

-- Add nodes with labels and properties
SELECT GRAPH_ADD_NODE('Person', '{"name": "Alice", "age": 30}');
-- → 1
SELECT GRAPH_ADD_NODE('Person', '{"name": "Bob", "age": 25}');
-- → 2
SELECT GRAPH_ADD_NODE('Company', '{"name": "Acme", "industry": "Tech"}');
-- → 3

-- Add directed edges with types and properties
SELECT GRAPH_ADD_EDGE(1, 2, 'KNOWS', '{"since": 2020}');
SELECT GRAPH_ADD_EDGE(1, 3, 'WORKS_AT', '{"role": "Engineer"}');
SELECT GRAPH_ADD_EDGE(2, 3, 'WORKS_AT', '{"role": "Designer"}');

Querying the Graph

Neighbors

-- Outgoing neighbors (default)
SELECT GRAPH_NEIGHBORS(1, 'out');
-- → [{"neighbor_id":2,"edge_id":1,"edge_type":"KNOWS"}, ...]

-- Incoming neighbors
SELECT GRAPH_NEIGHBORS(3, 'in');

-- Both directions
SELECT GRAPH_NEIGHBORS(1, 'both');

Shortest Path

-- Find shortest path between two nodes
SELECT GRAPH_SHORTEST_PATH(1, 3);
-- → [1, 3]  (direct edge exists)

Statistics

SELECT GRAPH_NODE_COUNT();  -- → 3
SELECT GRAPH_EDGE_COUNT();  -- → 3

Cypher Queries

Use GRAPH_QUERY for pattern matching with the Cypher query language:

-- Find all people
SELECT GRAPH_QUERY('MATCH (p:Person) RETURN p.name, p.age');

-- Traverse relationships
SELECT GRAPH_QUERY('
  MATCH (p:Person)-[:WORKS_AT]->(c:Company)
  RETURN p.name, c.name
');

-- Filter with WHERE
SELECT GRAPH_QUERY('
  MATCH (p:Person)-[r:KNOWS]->(q:Person)
  WHERE p.age > 25
  RETURN p.name, q.name
');

-- Create nodes and edges
SELECT GRAPH_QUERY('
  CREATE (n:City {name: "Portland", state: "OR"})
');

SELECT GRAPH_QUERY('
  CREATE (a:Person {name: "Charlie"})-[:KNOWS]->(b:Person {name: "Diana"})
');

Supported Cypher Features

| Feature | Example | |---------|---------| | Pattern matching | MATCH (a)-[r]->(b) | | Labels | (n:Person) | | Properties | {name: "Alice"} | | Edge types | -[:KNOWS]-> | | Directions | ->, <-, -- (undirected) | | Variable-length paths | -[*1..3]-> | | WHERE | WHERE n.age > 25 AND n.name = "Alice" | | OPTIONAL MATCH | Returns NULL if no match | | WITH | Intermediate projection | | DELETE | DELETE n, r | | COUNT | RETURN COUNT(*) |

Graph Algorithms

Built-in algorithms accessible through the graph engine:

| Algorithm | Purpose | |-----------|---------| | BFS | Breadth-first traversal | | DFS | Depth-first traversal | | Shortest Path | Unweighted (BFS-based) | | Dijkstra | Weighted shortest path using edge properties | | Connected Components | Find isolated subgraphs | | PageRank | Rank nodes by importance | | Label Propagation | Community detection | | Louvain | Modularity-optimized community detection |

Deleting Graph Data

-- Delete a node (cascades connected edges)
SELECT GRAPH_DELETE_NODE(1);

-- Delete an edge
SELECT GRAPH_DELETE_EDGE(1);

-- Delete via Cypher
SELECT GRAPH_QUERY('
  MATCH (n:Person {name: "Bob"})
  DELETE n
');

Performance

  • CSR (Compressed Sparse Row) format for cache-friendly analytical traversals
  • Property indexes (B-tree) per label/property for fast lookups
  • Label and type indexes for O(1) filtered traversals
  • Parallel BFS for multi-source traversals
  • Tiered storage with hot/cold separation (100K node threshold)
  • WAL-backed durability with crash recovery

Use Cases

  • Social networks — Friends, followers, mutual connections
  • Knowledge graphs — Entity relationships, ontologies
  • Fraud detection — Transaction paths, ring detection
  • Recommendation engines — User-item-category graphs
  • Network topology — Infrastructure dependencies