A Claude-written graph database in Rust. Use at your own risk.

GigaBrain CLI Examples#

This document provides practical examples of using the GigaBrain CLI for various common tasks.

Getting Started#

Starting the CLI#

# Build the CLI
cargo build --release --bin gigabrain-cli

# Start interactive REPL
./target/release/gigabrain-cli

# Or use shorter commands if in PATH
gigabrain-cli

Basic Graph Operations#

Creating Nodes and Relationships#

# Create person nodes
gigabrain> CREATE (alice:Person {name: 'Alice', age: 30, email: 'alice@example.com'})
gigabrain> CREATE (bob:Person {name: 'Bob', age: 25, email: 'bob@example.com'})
gigabrain> CREATE (charlie:Person {name: 'Charlie', age: 35, email: 'charlie@example.com'})

# Create a company
gigabrain> CREATE (techcorp:Company {name: 'TechCorp', founded: 2010, industry: 'Technology'})

# Create relationships
gigabrain> MATCH (alice:Person {name: 'Alice'}), (bob:Person {name: 'Bob'})
        -> CREATE (alice)-[:KNOWS {since: 2020}]->(bob)

gigabrain> MATCH (alice:Person {name: 'Alice'}), (techcorp:Company {name: 'TechCorp'})
        -> CREATE (alice)-[:WORKS_FOR {position: 'Senior Developer', since: 2022}]->(techcorp)

gigabrain> MATCH (bob:Person {name: 'Bob'}), (techcorp:Company {name: 'TechCorp'})
        -> CREATE (bob)-[:WORKS_FOR {position: 'Junior Developer', since: 2023}]->(techcorp)

Querying Data#

# Find all people
gigabrain> MATCH (p:Person) RETURN p.name, p.age, p.email

# Find relationships
gigabrain> MATCH (p:Person)-[r:KNOWS]->(friend:Person) 
        -> RETURN p.name as person, friend.name as friend, r.since as since

# Find coworkers
gigabrain> MATCH (p1:Person)-[:WORKS_FOR]->(company:Company)<-[:WORKS_FOR]-(p2:Person)
        -> WHERE p1 <> p2
        -> RETURN p1.name as person1, p2.name as person2, company.name as company

# Complex query with aggregation
gigabrain> MATCH (p:Person)-[:WORKS_FOR]->(c:Company)
        -> RETURN c.name as company, count(p) as employees
        -> ORDER BY employees DESC

Administrative Tasks#

Graph Statistics and Analysis#

# Show basic statistics
gigabrain> :stats

# Analyze graph structure
gigabrain> analyze structure

# Analyze connectivity
gigabrain> analyze connectivity

# Show schema information
gigabrain> :show schema

# Show sample nodes
gigabrain> :show nodes

# Show sample relationships
gigabrain> :show relationships

Performance Analysis#

# Run benchmark
gigabrain> benchmark

# Analyze performance characteristics
gigabrain> analyze performance

# Show memory usage
gigabrain> memory

# Profile a query
gigabrain> profile MATCH (p:Person)-[:KNOWS*1..3]->(friend) RETURN p.name, count(friend)

Database Maintenance#

# Create backup
gigabrain> backup daily_backup_20231201.json

# Optimize database
gigabrain> optimize

# Vacuum (cleanup)
gigabrain> vacuum

# Show connection info
gigabrain> connections

Data Import/Export#

JSON Export/Import#

# Export graph to JSON
gigabrain> :export graph_backup.json

# Import from JSON
gigabrain> :import graph_backup.json

# Using administrative commands
gigabrain> export-json full_export.json
gigabrain> import-json full_export.json

CSV Export/Import#

# Export people to CSV
gigabrain> export-csv people.csv "MATCH (p:Person) RETURN p.name, p.age, p.email"

# Export relationships to CSV
gigabrain> export-csv relationships.csv "MATCH (a)-[r]->(b) RETURN a.name, type(r), b.name"

# Import CSV data
gigabrain> import-csv new_people.csv

Batch Processing#

Command Files#

Create a file setup_social_network.cypher:

# Social network setup script
# Clear existing data
MATCH (n) DETACH DELETE n;

# Create people
CREATE (alice:Person {name: 'Alice', age: 30, city: 'New York'});
CREATE (bob:Person {name: 'Bob', age: 25, city: 'San Francisco'});
CREATE (charlie:Person {name: 'Charlie', age: 35, city: 'Los Angeles'});
CREATE (diana:Person {name: 'Diana', age: 28, city: 'Chicago'});
CREATE (eve:Person {name: 'Eve', age: 32, city: 'Boston'});

# Create friendships
MATCH (alice:Person {name: 'Alice'}), (bob:Person {name: 'Bob'})
CREATE (alice)-[:FRIENDS {since: 2018}]->(bob);

MATCH (bob:Person {name: 'Bob'}), (charlie:Person {name: 'Charlie'})
CREATE (bob)-[:FRIENDS {since: 2019}]->(charlie);

MATCH (charlie:Person {name: 'Charlie'}), (diana:Person {name: 'Diana'})
CREATE (charlie)-[:FRIENDS {since: 2020}]->(diana);

MATCH (diana:Person {name: 'Diana'}), (eve:Person {name: 'Eve'})
CREATE (diana)-[:FRIENDS {since: 2021}]->(eve);

MATCH (eve:Person {name: 'Eve'}), (alice:Person {name: 'Alice'})
CREATE (eve)-[:FRIENDS {since: 2017}]->(alice);

# Create some interests
CREATE (tech:Interest {name: 'Technology'});
CREATE (music:Interest {name: 'Music'});
CREATE (sports:Interest {name: 'Sports'});
CREATE (travel:Interest {name: 'Travel'});

# Connect people to interests
MATCH (alice:Person {name: 'Alice'}), (tech:Interest {name: 'Technology'})
CREATE (alice)-[:INTERESTED_IN]->(tech);

MATCH (alice:Person {name: 'Alice'}), (music:Interest {name: 'Music'})
CREATE (alice)-[:INTERESTED_IN]->(music);

MATCH (bob:Person {name: 'Bob'}), (tech:Interest {name: 'Technology'})
CREATE (bob)-[:INTERESTED_IN]->(tech);

MATCH (bob:Person {name: 'Bob'}), (sports:Interest {name: 'Sports'})
CREATE (bob)-[:INTERESTED_IN]->(sports);

# Show final statistics
MATCH (n) RETURN labels(n)[0] as type, count(n) as count;

Execute the file:

# Run the setup script
./gigabrain-cli --file setup_social_network.cypher

# Run silently for automation
./gigabrain-cli --file setup_social_network.cypher --silent

Analysis Queries File#

Create social_analysis.cypher:

# Social network analysis queries

# Find mutual friends
MATCH (a:Person)-[:FRIENDS]-(mutual)-[:FRIENDS]-(b:Person)
WHERE a <> b AND NOT (a)-[:FRIENDS]-(b)
RETURN a.name as person1, b.name as person2, mutual.name as mutual_friend;

# Find popular interests
MATCH (p:Person)-[:INTERESTED_IN]->(i:Interest)
RETURN i.name as interest, count(p) as popularity
ORDER BY popularity DESC;

# Find people with similar interests
MATCH (p1:Person)-[:INTERESTED_IN]->(i:Interest)<-[:INTERESTED_IN]-(p2:Person)
WHERE p1 <> p2
RETURN p1.name as person1, p2.name as person2, count(i) as shared_interests
ORDER BY shared_interests DESC;

# Find the social network diameter
MATCH path = shortestPath((a:Person)-[:FRIENDS*]-(b:Person))
WHERE a <> b
RETURN a.name as start, b.name as end, length(path) as distance
ORDER BY distance DESC
LIMIT 5;

# Show network statistics
MATCH (p:Person)
OPTIONAL MATCH (p)-[:FRIENDS]-(friend)
RETURN p.name as person, count(friend) as friend_count
ORDER BY friend_count DESC;

Run analysis:

./gigabrain-cli --file social_analysis.cypher --format table

Output Formatting#

Different Output Formats#

# Table format (default)
gigabrain> MATCH (p:Person) RETURN p.name, p.age LIMIT 3
╭────────────┬─────────╮
│    name    │   age   │
├────────────┼─────────┤
│   Alice    │   30│    Bob     │   25│  Charlie   │   35╰────────────┴─────────╯

# Switch to JSON
gigabrain> :format json
gigabrain> MATCH (p:Person) RETURN p.name, p.age LIMIT 3
{"columns": ["p.name", "p.age"], "rows": 3}

# Switch to CSV
gigabrain> :format csv
gigabrain> MATCH (p:Person) RETURN p.name, p.age LIMIT 3
p.name,p.age
Alice,30
Bob,25
Charlie,35

# Switch back to table
gigabrain> :format table

Command Line Format Options#

# JSON output for scripting
./gigabrain-cli --execute "MATCH (p:Person) RETURN count(p)" --format json

# CSV output for data analysis
./gigabrain-cli --execute "MATCH (p:Person) RETURN p.name, p.age" --format csv > people.csv

# Plain output for debugging
./gigabrain-cli --execute ":stats" --format plain

Advanced Examples#

Graph Algorithm Analysis#

# Create a more complex network for algorithm testing
CREATE (a:Node {id: 'A'}), (b:Node {id: 'B'}), (c:Node {id: 'C'}), 
       (d:Node {id: 'D'}), (e:Node {id: 'E'}), (f:Node {id: 'F'});

CREATE (a)-[:CONNECTS {weight: 1}]->(b),
       (b)-[:CONNECTS {weight: 2}]->(c),
       (c)-[:CONNECTS {weight: 1}]->(d),
       (d)-[:CONNECTS {weight: 3}]->(e),
       (e)-[:CONNECTS {weight: 1}]->(f),
       (f)-[:CONNECTS {weight: 2}]->(a),
       (a)-[:CONNECTS {weight: 4}]->(d),
       (b)-[:CONNECTS {weight: 1}]->(e);

# Find shortest paths
MATCH path = shortestPath((start:Node {id: 'A'})-[:CONNECTS*]-(end:Node {id: 'E'}))
RETURN start.id as start, end.id as end, length(path) as hops;

# Show node connectivity
MATCH (n:Node)
OPTIONAL MATCH (n)-[:CONNECTS]-(connected)
RETURN n.id as node, count(connected) as degree
ORDER BY degree DESC;

Time-Series Data Analysis#

# Create time-series events
CREATE (user1:User {id: 'user1'}),
       (user2:User {id: 'user2'}),
       (user3:User {id: 'user3'});

CREATE (event1:Event {type: 'login', timestamp: 1640995200}),
       (event2:Event {type: 'purchase', timestamp: 1640995800}),
       (event3:Event {type: 'logout', timestamp: 1640996400});

CREATE (user1)-[:PERFORMED]->(event1),
       (user1)-[:PERFORMED]->(event2),
       (user1)-[:PERFORMED]->(event3);

# Query events by time
MATCH (u:User)-[:PERFORMED]->(e:Event)
WHERE e.timestamp > 1640995000
RETURN u.id as user, e.type as event, e.timestamp as time
ORDER BY time;

Scripting and Automation#

Backup Script#

Create backup.sh:

#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="gigabrain_backup_${DATE}.json"

echo "Creating backup: ${BACKUP_FILE}"
./gigabrain-cli --execute "backup ${BACKUP_FILE}" --silent

if [ $? -eq 0 ]; then
    echo "Backup completed successfully"
    # Optionally upload to cloud storage
    # aws s3 cp "${BACKUP_FILE}" s3://my-backups/gigabrain/
else
    echo "Backup failed!"
    exit 1
fi

Health Check Script#

Create health_check.sh:

#!/bin/bash
STATS=$(./gigabrain-cli --execute ":stats" --format json --silent)
NODE_COUNT=$(echo $STATS | jq -r '.nodes // 0')

if [ "$NODE_COUNT" -gt 0 ]; then
    echo "Database healthy: $NODE_COUNT nodes"
    exit 0
else
    echo "Database issue: No nodes found"
    exit 1
fi

Data Migration Script#

Create migrate_data.cypher:

# Data migration script
# Add new properties to existing nodes
MATCH (p:Person)
WHERE NOT EXISTS(p.created_at)
SET p.created_at = timestamp();

# Create indexes for performance
# Note: Index creation syntax may vary
MATCH (p:Person) WHERE EXISTS(p.email) SET p:EmailUser;

# Update relationship properties
MATCH (p1:Person)-[r:FRIENDS]->(p2:Person)
WHERE NOT EXISTS(r.strength)
SET r.strength = 1.0;

# Show migration results
MATCH (p:Person) 
RETURN 
  count(p) as total_people,
  count(CASE WHEN EXISTS(p.created_at) THEN 1 END) as with_timestamps,
  count(CASE WHEN p:EmailUser THEN 1 END) as email_users;

Troubleshooting Examples#

Performance Issues#

# Identify slow queries by profiling
gigabrain> profile MATCH (p:Person)-[:FRIENDS*1..5]->(distant) RETURN p.name, count(distant)

# Check memory usage
gigabrain> memory

# Analyze performance characteristics
gigabrain> analyze performance

# Optimize database
gigabrain> optimize

Data Validation#

# Check for orphaned nodes
MATCH (n)
WHERE NOT (n)--()
RETURN labels(n)[0] as type, count(n) as orphaned_count;

# Validate relationship consistency
MATCH (p:Person)-[r:FRIENDS]->(friend:Person)
WHERE NOT EXISTS((friend)-[:FRIENDS]->(p))
RETURN p.name as person, friend.name as one_way_friend;

# Check for duplicate data
MATCH (p1:Person), (p2:Person)
WHERE p1 <> p2 AND p1.email = p2.email
RETURN p1.name as person1, p2.name as person2, p1.email as duplicate_email;

Debugging Connection Issues#

# Check connection status
gigabrain> connections

# Test basic functionality
gigabrain> CREATE (test:Test {id: 1}) RETURN test

# Clean up test data
gigabrain> MATCH (test:Test) DELETE test

# Show recent logs (if implemented)
gigabrain> logs recent

These examples demonstrate the full capabilities of the GigaBrain CLI for interactive use, batch processing, administration, and automation. The CLI provides a powerful interface for both development and production use cases.