GigaBrain API Documentation#
GigaBrain provides both REST and gRPC APIs for graph database operations. This documentation covers both interfaces.
Table of Contents#
Authentication#
GigaBrain uses JWT (JSON Web Tokens) for authentication. Include the token in the Authorization header:
Authorization: Bearer <your-jwt-token>
Roles#
- Admin: Full access to all operations including user management
- ReadWrite: Can read and modify graph data
- ReadOnly: Can only read graph data
REST API#
Base URL: http://localhost:3000/api/v1
Health Check#
GET /health
Returns server health status.
Response:
{
"status": "healthy",
"version": "0.1.0",
"uptime_seconds": 3600
}
Nodes#
Create Node#
POST /nodes
Creates a new node in the graph.
Request Body:
{
"labels": ["Person", "Employee"],
"properties": {
"name": "John Doe",
"age": 30,
"active": true,
"salary": 75000.50
}
}
Response:
{
"node_id": 12345
}
Get Node#
GET /nodes/{node_id}
Retrieves a node by its ID.
Response:
{
"node": {
"id": 12345,
"labels": ["Person", "Employee"],
"properties": {
"name": "John Doe",
"age": 30,
"active": true,
"salary": 75000.50
}
}
}
Update Node#
PUT /nodes/{node_id}
Updates an existing node's labels and/or properties. Labels are completely replaced if provided, while properties are merged with existing ones.
Request Body:
{
"labels": ["Person", "Manager"],
"properties": {
"title": "Engineering Manager",
"department": "Technology",
"team_size": 8
}
}
Response:
{
"id": 12345,
"labels": ["Person", "Manager"],
"properties": {
"name": "John Doe",
"age": 30,
"title": "Engineering Manager",
"department": "Technology",
"team_size": 8
}
}
Notes:
- Labels: If provided, completely replace existing labels
- Properties: If provided, merge with existing properties (new properties are added, existing ones are updated)
- Both
labelsandpropertiesfields are optional
Delete Node Property#
DELETE /nodes/{node_id}/properties/{property_key}
Deletes a specific property from a node.
Response:
{
"id": 12345,
"labels": ["Person", "Manager"],
"properties": {
"name": "John Doe",
"age": 30,
"department": "Technology"
}
}
Error Response (404):
{
"error": "Property 'salary' not found",
"code": 404
}
Delete Node#
DELETE /nodes/{node_id}
Deletes a node from the graph.
Response:
- Status:
204 No Content - Body: Empty
Relationships#
Create Relationship#
POST /relationships
Creates a new relationship between two nodes.
Request Body:
{
"start_node": {
"id": 12345
},
"end_node": {
"id": 67890
},
"rel_type": "WORKS_FOR",
"properties": [
{
"key": "since",
"value": {
"string_value": "2023-01-01"
}
}
]
}
Response:
{
"relationship_id": {
"id": 98765
}
}
Get Relationship#
GET /relationships/{relationship_id}
Retrieves a relationship by its ID.
Response:
{
"relationship": {
"id": {
"id": 98765
},
"start_node": {
"id": 12345
},
"end_node": {
"id": 67890
},
"rel_type": "WORKS_FOR",
"properties": []
}
}
Delete Relationship#
DELETE /relationships/{relationship_id}
Deletes a relationship from the graph.
Response:
{
"success": true
}
Cypher Queries#
Execute Cypher Query#
POST /cypher
Executes a Cypher query against the graph.
Request Body:
{
"query": "MATCH (n:Person) WHERE n.age > 25 RETURN n.name, n.age",
"parameters": {}
}
Response:
{
"results": [
{
"columns": ["n.name", "n.age"],
"data": [
["John Doe", 30],
["Jane Smith", 28]
]
}
],
"error": "",
"execution_time_ms": 15
}
Graph Algorithms#
Shortest Path#
POST /algorithms/shortest-path
Finds the shortest path between two nodes.
Request Body:
{
"start_node": {
"id": 12345
},
"end_node": {
"id": 67890
},
"max_depth": 10
}
Response:
{
"path": [
{"id": 12345},
{"id": 54321},
{"id": 67890}
],
"total_weight": 2.0
}
PageRank#
POST /algorithms/pagerank
Calculates PageRank scores for specified nodes.
Request Body:
{
"nodes": [
{"id": 12345},
{"id": 67890}
],
"damping_factor": 0.85,
"max_iterations": 100,
"tolerance": 0.0001
}
Response:
{
"rankings": {
"12345": 0.15,
"67890": 0.25
}
}
Centrality#
POST /algorithms/centrality
Calculates various centrality measures.
Request Body:
{
"algorithm": "betweenness",
"nodes": [
{"id": 12345},
{"id": 67890}
]
}
Response:
{
"centrality": {
"12345": 0.35,
"67890": 0.42
}
}
Community Detection#
POST /algorithms/community-detection
Detects communities in the graph.
Request Body:
{
"algorithm": "louvain",
"resolution": 1.0
}
Response:
{
"communities": [
[12345, 23456, 34567],
[67890, 78901, 89012]
],
"modularity": 0.45
}
Graph Statistics#
Get Graph Stats#
GET /stats
Returns statistics about the graph.
Response:
{
"node_count": 1000,
"relationship_count": 2500,
"relationship_types": ["KNOWS", "WORKS_FOR", "LIVES_IN"],
"labels": ["Person", "Company", "City"]
}
API Documentation#
Get API Documentation#
GET /docs
Returns this API documentation in JSON format.
Schema Constraints#
Create Constraint#
POST /constraints
Creates a new schema constraint to enforce data integrity rules.
Request Body:
{
"constraint_type": "required",
"label": "Employee",
"property": "email"
}
Constraint Types:
- Required Constraint
{
"constraint_type": "required",
"label": "Employee",
"property": "email"
}
- Type Constraint
{
"constraint_type": "type",
"label": "Employee",
"property": "salary",
"type_value": "integer"
}
Supported types: string, integer, float, boolean
- Range Constraint
{
"constraint_type": "range",
"label": "Employee",
"property": "salary",
"min_value": 30000,
"max_value": 200000
}
- Pattern Constraint
{
"constraint_type": "pattern",
"label": "User",
"property": "email",
"pattern": "@"
}
- Enum Constraint
{
"constraint_type": "enum",
"label": "Task",
"property": "status",
"allowed_values": ["pending", "in_progress", "completed"]
}
Response:
{
"id": "required:Employee:email",
"constraint_type": "required",
"label": "Employee",
"property": "email",
"details": {}
}
List Constraints#
GET /constraints
Lists all defined schema constraints.
Response:
[
{
"id": "required:Employee:email",
"constraint_type": "required",
"label": "Employee",
"property": "email",
"details": {}
},
{
"id": "type:Employee:salary",
"constraint_type": "type",
"label": "Employee",
"property": "salary",
"details": {
"type": "Integer"
}
}
]
gRPC API#
The gRPC API provides the same functionality as the REST API but uses Protocol Buffers for serialization. The service is defined in proto/gigabrain.proto.
Service Definition#
service GigaBrainService {
// Node operations
rpc CreateNode(CreateNodeRequest) returns (CreateNodeResponse);
rpc GetNode(GetNodeRequest) returns (GetNodeResponse);
rpc UpdateNode(UpdateNodeRequest) returns (UpdateNodeResponse);
rpc DeleteNode(DeleteNodeRequest) returns (DeleteNodeResponse);
// Relationship operations
rpc CreateRelationship(CreateRelationshipRequest) returns (CreateRelationshipResponse);
rpc GetRelationship(GetRelationshipRequest) returns (GetRelationshipResponse);
rpc DeleteRelationship(DeleteRelationshipRequest) returns (DeleteRelationshipResponse);
// Query operations
rpc ExecuteCypher(CypherQueryRequest) returns (CypherQueryResponse);
// Algorithm operations
rpc ShortestPath(ShortestPathRequest) returns (ShortestPathResponse);
rpc PageRank(PageRankRequest) returns (PageRankResponse);
rpc Centrality(CentralityRequest) returns (CentralityResponse);
rpc CommunityDetection(CommunityDetectionRequest) returns (CommunityDetectionResponse);
// Stats operations
rpc GetGraphStats(GraphStatsRequest) returns (GraphStatsResponse);
}
Connection#
Connect to the gRPC server at localhost:50051.
Property Values#
Property values can be one of the following types:
string_value: String dataint_value: 64-bit integerfloat_value: 64-bit floating pointbool_value: Booleanbytes_value: Binary data
Error Handling#
HTTP Status Codes#
200 OK: Successful operation400 Bad Request: Invalid request data401 Unauthorized: Authentication required403 Forbidden: Insufficient permissions404 Not Found: Resource not found500 Internal Server Error: Server error
Error Response Format#
{
"error": "Node ID is required",
"code": 400
}
gRPC Status Codes#
OK: Successful operationINVALID_ARGUMENT: Invalid request parametersNOT_FOUND: Resource not foundINTERNAL: Internal server errorUNAUTHENTICATED: Authentication failedPERMISSION_DENIED: Authorization failed
Examples#
Creating a Social Network#
# Create users
curl -X POST http://localhost:3000/api/v1/nodes \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"labels": ["Person"],
"properties": {
"name": "Alice",
"age": 25
}
}'
curl -X POST http://localhost:3000/api/v1/nodes \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"labels": ["Person"],
"properties": {
"name": "Bob",
"age": 30
}
}'
# Create friendship
curl -X POST http://localhost:3000/api/v1/relationships \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"start_node": 1,
"end_node": 2,
"rel_type": "FRIENDS",
"properties": {
"since": "2023-01-01"
}
}'
# Find mutual friends
curl -X POST http://localhost:3000/api/v1/cypher \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"query": "MATCH (a:Person)-[:FRIENDS]-(mutual)-[:FRIENDS]-(b:Person) WHERE a.name = $name1 AND b.name = $name2 RETURN mutual.name",
"parameters": {"name1": "Alice", "name2": "Bob"}
}'
# Update a node
curl -X PUT http://localhost:3000/api/v1/nodes/1 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"labels": ["Person", "VIP"],
"properties": {
"status": "premium",
"last_seen": "2023-12-01"
}
}'
# Delete a specific property
curl -X DELETE http://localhost:3000/api/v1/nodes/1/properties/age \
-H "Authorization: Bearer <token>"
Working with Schema Constraints#
# Create a required email constraint for Employee nodes
curl -X POST http://localhost:3000/api/v1/constraints \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"constraint_type": "required",
"label": "Employee",
"property": "email"
}'
# Create a type constraint for salary
curl -X POST http://localhost:3000/api/v1/constraints \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"constraint_type": "type",
"label": "Employee",
"property": "salary",
"type_value": "integer"
}'
# Create a range constraint for salary
curl -X POST http://localhost:3000/api/v1/constraints \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"constraint_type": "range",
"label": "Employee",
"property": "salary",
"min_value": 30000,
"max_value": 200000
}'
# Try to create an employee without email (will fail)
curl -X POST http://localhost:3000/api/v1/nodes \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"labels": ["Employee"],
"properties": {
"name": "John Doe",
"salary": 50000
}
}'
# Response: {"error": "Validation error: Required property 'email' is missing", "code": 400}
# Create an employee with all required properties
curl -X POST http://localhost:3000/api/v1/nodes \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"labels": ["Employee"],
"properties": {
"name": "John Doe",
"email": "john@example.com",
"salary": 50000
}
}'
Running Graph Algorithms#
# Calculate shortest path
curl -X POST http://localhost:3000/api/v1/algorithms/shortest-path \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"start_node": 1,
"end_node": 10,
"relationship_types": ["FRIENDS", "KNOWS"]
}'
# Run PageRank
curl -X POST http://localhost:3000/api/v1/algorithms/pagerank \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{
"nodes": [1, 2, 3],
"damping_factor": 0.85
}'
Performance Considerations#
- Use batch operations when creating multiple nodes/relationships
- Enable request compression for large payloads
- Consider using gRPC for high-performance scenarios
- Implement connection pooling for production use
- Use streaming for large result sets
Rate Limiting#
The API implements rate limiting to prevent abuse:
- Default limit: 1000 requests per minute per IP
- Burst limit: 100 requests per second
- Headers:
X-RateLimit-Remaining,X-RateLimit-Reset
Monitoring#
Monitor API performance using the built-in metrics:
- Request count and duration
- Error rates by endpoint
- Active connections
- Memory and CPU usage
Access metrics at: GET /metrics (Prometheus format)