Database API Reference¶
Complete API reference for working with ArcadeDB databases in Python.
Module Functions¶
create_database¶
Create a new database at the specified path.
Parameters:
path(str): File system path where the database will be created
Returns:
Database: Database instance
Raises:
ArcadeDBError: If database creation fails or path already exists
Example:
import arcadedb_embedded as arcadedb
with arcadedb.create_database("./mydb") as db:
# Schema operations are auto-transactional
db.schema.create_document_type("Person")
db.schema.create_property("Person", "name", "STRING")
Use Context Manager
Prefer using with statement for automatic cleanup:
open_database¶
Open an existing database.
Parameters:
path(str): Path to the existing database
Returns:
Database: Database instance
Raises:
ArcadeDBError: If database doesn't exist or can't be opened
Example:
with arcadedb.open_database("./mydb") as db:
result = db.query("sql", "SELECT FROM Person")
print(f"Found {len(list(result))} records")
database_exists¶
Check if a database exists at the given path.
Parameters:
path(str): Path to check
Returns:
bool: True if database exists, False otherwise
Example:
if arcadedb.database_exists("./mydb"):
db = arcadedb.open_database("./mydb")
else:
db = arcadedb.create_database("./mydb")
Database Class¶
The main database interface for executing queries, managing transactions, and creating records.
Constructor¶
Parameters:
java_database: Java Database object (internal use - use factory functions instead)
Direct Construction
Don't create Database instances directly. Use create_database(), open_database(), or DatabaseFactory instead.
query¶
Execute a query and return results. Queries are read-only and don't require a transaction.
Parameters:
language(str): Query language -"sql","opencypher","mongo","graphql"command(str): Query string*args: Optional parameters to bind to the query
Returns:
ResultSet: Iterable result set
Raises:
ArcadeDBError: If query fails or database is closed
Example:
# Simple query
result = db.query("sql", "SELECT FROM Person WHERE age > 25")
for record in result:
print(record.get('name'))
# Parameterized query
result = db.query("sql", "SELECT FROM Person WHERE age > ?", 25)
# OpenCypher query
result = db.query("opencypher", """
MATCH (p:Person)-[:Knows]->(friend)
WHERE p.age > $min_age
RETURN friend.name
""", {"min_age": 25})
Supported Languages:
| Language | Notes |
|---|---|
sql |
ArcadeDB SQL |
opencypher |
OpenCypher graph query language |
mongo |
MongoDB query syntax |
graphql |
GraphQL queries |
command¶
Execute a command (write operation). Commands modify data and require a transaction.
Parameters:
language(str): Command language (usually"sql"or"opencypher")command(str): Command string*args: Optional parameters
Returns:
ResultSetorNone: Result set if command returns data, None otherwise
Raises:
ArcadeDBError: If command fails, database is closed, or no transaction is active
Example:
# Schema operations are auto-transactional
db.schema.create_document_type("Person")
db.schema.create_property("Person", "name", "STRING")
db.schema.create_property("Person", "age", "INTEGER")
# Data operations must be in a transaction
with db.transaction():
doc = db.new_document("Person")
doc.set("name", "Alice")
doc.set("age", 30)
doc.save()
# Update data via API
doc.set("age", 31)
doc.save()
# Delete data
doc.delete()
Transaction Required
Write operations must be wrapped in a transaction:
transaction¶
Create a transaction context manager.
Returns:
TransactionContext: Context manager for transaction
Example:
with db.transaction():
for name in ["Alice", "Bob"]:
doc = db.new_document("Person")
doc.set("name", name)
doc.save()
# Automatic commit on success, rollback on exception
Manual Transaction Control:
# Alternative: manual control
db.begin()
try:
for name in ["Alice", "Bob"]:
doc = db.new_document("Person")
doc.set("name", name)
doc.save()
db.commit()
except Exception as e:
db.rollback()
raise
begin¶
Begin a new transaction. Prefer using transaction() context manager.
Raises:
ArcadeDBError: If transaction cannot be started
commit¶
Commit the current transaction.
Raises:
ArcadeDBError: If commit fails or no transaction is active
rollback¶
Rollback the current transaction.
Raises:
ArcadeDBError: If rollback fails
new_vertex¶
Create a new vertex (graph node). Requires a transaction.
Parameters:
type_name(str): Vertex type name (must be defined in schema)
Returns:
MutableVertex: Java vertex object with.set(),.save()methods
Raises:
ArcadeDBError: If type doesn't exist or transaction not active
Example:
with db.transaction():
vertex = db.new_vertex("Person")
vertex.set("name", "Alice")
vertex.set("age", 30)
vertex.save()
print(f"Created: {vertex.get_rid()}")
Creating Edges
There is no db.new_edge() method. Edges are created from vertices:
new_document¶
Create a new document (non-graph record). Requires a transaction.
Parameters:
type_name(str): Document type name
Returns:
MutableDocument: Java document object
Example:
with db.transaction():
doc = db.new_document("Person")
doc.set("name", "Alice")
doc.set("email", "alice@example.com")
doc.save()
lookup_by_rid¶
Lookup a record by its RID.
Parameters:
rid(str): Record ID string (e.g. "#10:5")
Returns:
Recordobject (Vertex, Document, or Edge) orNoneif not found
Example:
lookup_by_key¶
Lookup a record by an indexed key (O(1) index-based lookup).
Parameters:
type_name(str): Type namekeys(List[str]): Indexed property namesvalues(List[Any]): Values for the indexed properties
Returns:
Record(Vertex/Document/Edge) orNoneif not found
Example:
db.schema.create_vertex_type("User")
db.schema.create_property("User", "email", "STRING")
db.schema.create_index("User", ["email"], unique=True)
with db.transaction():
db.new_vertex("User").set("email", "alice@example.com").save()
found = db.lookup_by_key("User", ["email"], ["alice@example.com"])
if found:
print(found.get("email"))
count_type¶
Count records of a specific type (polymorphic). Returns 0 if the type is missing.
drop¶
Drop the entire database (irreversible).
is_transaction_active¶
Check if a transaction is currently active.
set_wal_flush¶
Configure WAL flush strategy. Modes: "no", "yes_nometadata", "yes_full".
set_read_your_writes¶
Toggle read-your-writes consistency for the current connection.
set_auto_transaction¶
Enable or disable automatic transaction management.
async_executor¶
export_database¶
db.export_database(
file_path: str,
format: str = "jsonl",
overwrite: bool = False,
include_types: Optional[List[str]] = None,
exclude_types: Optional[List[str]] = None,
verbose: int = 1,
) -> dict
Export the database to JSONL (backup/restore), GraphML, or GraphSON.
export_to_csv¶
db.export_to_csv(query: str, file_path: str, language: str = "sql", fieldnames: Optional[List[str]] = None)
Run a query and write results to CSV.
create_vector_index¶
db.create_vector_index(
vertex_type: str,
vector_property: str,
dimensions: int,
distance_function: str = "cosine",
max_connections: int = 16,
beam_width: int = 100,
quantization: str = "INT8",
location_cache_size: int | None = None,
graph_build_cache_size: int | None = None,
mutations_before_rebuild: int | None = None,
store_vectors_in_graph: bool = False,
add_hierarchy: bool | None = True,
pq_subspaces: int | None = None,
pq_clusters: int | None = None,
pq_center_globally: bool | None = None,
pq_training_limit: int | None = None,
) -> VectorIndex
Create a vector index for similarity search (JVector implementation). Existing records are indexed automatically when the index is created.
Parameters:`
vertex_type(str): Vertex type containing vectorsvector_property(str): Property storing vector arraysdimensions(int): Vector dimensionalitydistance_function(str):"cosine","euclidean", or"inner_product"max_connections(int): Max connections per node (default: 16). Maps tomaxConnectionsin HNSW (JVector).beam_width(int): Beam width for search/construction (default: 100). Maps tobeamWidthin HNSW (JVector).quantization(str | None):"INT8","BINARY","PRODUCT"for PQ, orNonefor full precision (default:"INT8").location_cache_size(int | None): Override location cache size (default:None, uses engine default).graph_build_cache_size(int | None): Override graph build cache size (default:None, uses engine default).mutations_before_rebuild(int | None): Override rebuild threshold (default:None, uses engine default).store_vectors_in_graph(bool): Persist vectors inline in graph file (faster reopen/search, larger graph).add_hierarchy(bool | None): Force enabling/disabling HNSW hierarchy (default:True).pq_subspaces(int | None): PQ subspaces (M). Requiresquantization="PRODUCT".pq_clusters(int | None): PQ clusters per subspace (K). Requiresquantization="PRODUCT".pq_center_globally(bool | None): PQ global centering flag. Requiresquantization="PRODUCT".pq_training_limit(int | None): PQ training sample cap. Requiresquantization="PRODUCT".
Returns:
VectorIndex: Index object for similarity search
Example:
import numpy as np
# Create schema (auto-transactional)
db.schema.create_vertex_type("Document")
db.schema.create_property("Document", "embedding", "ARRAY_OF_FLOATS")
db.schema.create_property("Document", "id", "STRING")
# Create vector index
index = db.create_vector_index("Document", "embedding", dimensions=384)
# Add vectors
with db.transaction():
for i, embedding in enumerate(embeddings):
vertex = db.new_vertex("Document")
vertex.set("id", f"doc_{i}")
vertex.set("embedding", arcadedb.to_java_float_array(embedding))
vertex.save()
# Search
query_vector = np.random.rand(384)
results = index.find_nearest(query_vector, k=5)
See Vector Search Guide for details.
close¶
Close the database connection.
Example:
Context Manager
Prefer using with statement for automatic cleanup
is_open¶
Check if database connection is open.
Returns:
bool: True if database is open
get_name¶
Get the database name.
Returns:
str: Database name
get_database_path¶
Get the file system path to the database.
Returns:
str: Database path
DatabaseFactory Class¶
Factory for creating and opening databases with custom configuration.
Constructor¶
Parameters:
path(str): Database path
Example:
factory = arcadedb.DatabaseFactory("./mydb")
if factory.exists():
db = factory.open()
else:
db = factory.create()
create¶
Create a new database.
open¶
Open an existing database.
exists¶
Check if database exists.
Context Manager Support¶
All database objects support context managers:
# Database
with arcadedb.create_database("./mydb") as db:
# Automatic cleanup
pass
# Transaction
with db.transaction():
# Auto commit/rollback
pass
Query Languages¶
SQL¶
ArcadeDB's extended SQL with graph and document support:
# Documents
db.query("sql", "SELECT FROM Person WHERE age > 25")
# Graph traversal
db.query("sql", "SELECT expand(out('Knows')) FROM Person WHERE name = 'Alice'")
# Aggregation
db.query("sql", "SELECT count(*) as total, avg(age) as avg_age FROM Person")
OpenCypher¶
OpenCypher graph query language:
db.query("opencypher", """
MATCH (person:Person)-[:Knows]->(friend)
WHERE person.age > 25
RETURN friend.name, friend.age
""")
Best Practices¶
1. Use Context Managers¶
# ✅ Good - automatic cleanup
with arcadedb.create_database("./mydb") as db:
pass
# ❌ Avoid - manual cleanup
db = arcadedb.create_database("./mydb")
db.close()
2. Always Use Transactions for Writes¶
# ✅ Good
with db.transaction():
person = db.new_document("Person")
person.set("name", "Alice").save()
# ❌ Will fail
db.command("sql", "INSERT INTO Person SET name = 'Alice'")
3. Use Parameterized Queries¶
# ✅ Good - safe from injection
name = user_input
db.query("sql", "SELECT FROM Person WHERE name = ?", name)
# ❌ Dangerous - SQL injection risk
db.query("sql", f"SELECT FROM Person WHERE name = '{user_input}'")
4. Check Database Existence¶
if arcadedb.database_exists("./mydb"):
db = arcadedb.open_database("./mydb")
else:
db = arcadedb.create_database("./mydb")
See Also¶
- Graph Operations: Working with vertices and edges
- Vector Search: Similarity search with HNSW (JVector) indexes
- Server Mode: HTTP API and Studio UI
- Quick Start: Getting started guide