Skip to main content

Embedded knowledge graph database for AI and RAG applications

Project description

LatticeDB Python Bindings

Python bindings for LatticeDB, an embedded knowledge graph database for AI/RAG applications.

Installation

pip install latticedb

The native shared library (liblattice.dylib / liblattice.so) must be available on the system. Install it via the install script or build from source with zig build shared.

Quick Start

import numpy as np
from latticedb import Database

with Database("knowledge.db", create=True, enable_vector=True, vector_dimensions=4) as db:
    # Create nodes, edges, and index content
    with db.write() as txn:
        alice = txn.create_node(
            labels=["Person"],
            properties={"name": "Alice", "age": 30},
        )
        bob = txn.create_node(
            labels=["Person"],
            properties={"name": "Bob", "age": 25},
        )
        txn.create_edge(alice.id, bob.id, "KNOWS")

        # Index text for full-text search
        txn.fts_index(alice.id, "Alice works on machine learning research")
        txn.fts_index(bob.id, "Bob studies deep learning and neural networks")

        # Store vector embeddings
        txn.set_vector(alice.id, "embedding", np.array([1.0, 0.0, 0.0, 0.0], dtype=np.float32))
        txn.set_vector(bob.id, "embedding", np.array([0.0, 1.0, 0.0, 0.0], dtype=np.float32))

        txn.commit()

    # Query with Cypher
    result = db.query("MATCH (n:Person) WHERE n.age > 20 RETURN n.name, n.age")
    for row in result:
        print(row)

    # Vector similarity search
    query_vec = np.array([0.9, 0.1, 0.0, 0.0], dtype=np.float32)
    for r in db.vector_search(query_vec, k=2):
        print(f"Node {r.node_id}: distance={r.distance:.4f}")

    # Full-text search
    for r in db.fts_search("machine learning"):
        print(f"Node {r.node_id}: score={r.score:.4f}")

    # Fuzzy search (typo-tolerant)
    for r in db.fts_search_fuzzy("machin lerning"):
        print(f"Node {r.node_id}: score={r.score:.4f}")

API Reference

Database

Database(
    path: str | Path,
    *,
    create: bool = False,        # Create if doesn't exist
    read_only: bool = False,     # Open in read-only mode
    cache_size_mb: int = 100,    # Page cache size
    enable_vector: bool = False, # Enable vector storage
    vector_dimensions: int = 128 # Vector dimensions
)

Methods

  • open() / close() - Open/close the database (also works as context manager)
  • read() - Start a read-only transaction (context manager)
  • write() - Start a read-write transaction (context manager)
  • query(cypher, parameters=None) - Execute a Cypher query
  • vector_search(vector, k=10, ef_search=64) - k-NN vector search
  • fts_search(query, limit=10) - Full-text search
  • fts_search_fuzzy(query, limit=10, max_distance=0, min_term_length=0) - Fuzzy full-text search
  • cache_clear() - Clear the query cache
  • cache_stats() - Get cache hit/miss statistics

Transaction

Read Operations

  • get_node(node_id) - Get a node by ID, returns Node or None
  • node_exists(node_id) - Check if a node exists
  • get_property(node_id, key) - Get a property value
  • get_outgoing_edges(node_id) - Get outgoing edges from a node
  • get_incoming_edges(node_id) - Get incoming edges to a node
  • is_read_only / is_active - Transaction state

Write Operations

  • create_node(labels=[], properties=None) - Create a node
  • delete_node(node_id) - Delete a node
  • set_property(node_id, key, value) - Set a property on a node
  • set_vector(node_id, key, vector) - Set a vector embedding
  • batch_insert(label, vectors) - Batch insert nodes with vectors (see below)
  • fts_index(node_id, text) - Index text for full-text search
  • create_edge(source_id, target_id, edge_type) - Create an edge
  • delete_edge(source_id, target_id, edge_type) - Delete an edge
  • commit() / rollback() - Commit or rollback the transaction

Batch Insert

Insert many nodes with vectors in a single efficient call:

import numpy as np

with Database("vectors.db", create=True, enable_vector=True, vector_dimensions=128) as db:
    with db.write() as txn:
        vectors = np.random.rand(1000, 128).astype(np.float32)
        node_ids = txn.batch_insert("Document", vectors)
        print(f"Created {len(node_ids)} nodes")
        txn.commit()

Full-Text Search

Exact Search

results = db.fts_search("machine learning", limit=10)
for r in results:
    print(f"Node {r.node_id}: score={r.score:.4f}")

Fuzzy Search (Typo-Tolerant)

# Finds "machine learning" even with typos
results = db.fts_search_fuzzy("machne lerning", limit=10)

# Control fuzzy matching sensitivity
results = db.fts_search_fuzzy(
    "machne",
    limit=10,
    max_distance=2,      # Max edit distance (default: 2)
    min_term_length=4,   # Min term length for fuzzy matching (default: 4)
)

Embeddings

LatticeDB includes a built-in hash embedding function and an HTTP client for external embedding services.

Hash Embeddings (Built-in)

Deterministic, no external service needed. Useful for testing or simple keyword-based similarity:

from latticedb import hash_embed

vec = hash_embed("hello world", dimensions=128)
print(vec.shape)  # (128,)

HTTP Embedding Client

Connect to Ollama, OpenAI, or compatible APIs:

from latticedb import EmbeddingClient, EmbeddingApiFormat

# Ollama (default)
with EmbeddingClient("http://localhost:11434") as client:
    vec = client.embed("hello world")

# OpenAI-compatible API
with EmbeddingClient(
    "https://api.openai.com/v1",
    model="text-embedding-3-small",
    api_format=EmbeddingApiFormat.OPENAI,
    api_key="sk-...",
) as client:
    vec = client.embed("hello world")

Edge Traversal

with db.read() as txn:
    outgoing = txn.get_outgoing_edges(node_id)
    for edge in outgoing:
        print(f"{edge.source_id} --[{edge.edge_type}]--> {edge.target_id}")

    incoming = txn.get_incoming_edges(node_id)
    for edge in incoming:
        print(f"{edge.source_id} --[{edge.edge_type}]--> {edge.target_id}")

Cypher Queries

# Pattern matching
result = db.query("MATCH (n:Person) RETURN n.name")

# With parameters
result = db.query(
    "MATCH (n:Person) WHERE n.name = $name RETURN n",
    parameters={"name": "Alice"},
)

# Vector similarity in Cypher
result = db.query(
    "MATCH (n:Document) WHERE n.embedding <=> $vec < 0.5 RETURN n.title",
    parameters={"vec": query_vector},
)

# Full-text search in Cypher
result = db.query(
    'MATCH (n:Document) WHERE n.content @@ "machine learning" RETURN n.title'
)

# Data mutation
db.query("CREATE (n:Person {name: 'Charlie', age: 35})")
db.query("MATCH (n:Person {name: 'Charlie'}) SET n.age = 36")
db.query("MATCH (n:Person {name: 'Charlie'}) DETACH DELETE n")

Query Cache

# Get cache statistics
stats = db.cache_stats()
print(f"Entries: {stats['entries']}, Hits: {stats['hits']}, Misses: {stats['misses']}")

# Clear the cache
db.cache_clear()

Supported Property Types

  • None - Null value
  • bool - Boolean
  • int - 64-bit integer
  • float - 64-bit float
  • str - UTF-8 string
  • bytes - Binary data

Error Handling

from latticedb import LatticeError, LatticeNotFoundError, LatticeIOError

try:
    with Database("nonexistent.db") as db:
        pass
except LatticeNotFoundError:
    print("Database not found")
except LatticeIOError:
    print("I/O error")
except LatticeError as e:
    print(f"Error: {e}")

Requirements

  • Python 3.9+
  • NumPy (for vector operations)
  • The native LatticeDB library (liblattice.dylib / liblattice.so)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

latticedb-0.2.1.tar.gz (25.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

latticedb-0.2.1-py3-none-manylinux_2_17_x86_64.whl (2.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

latticedb-0.2.1-py3-none-manylinux_2_17_aarch64.whl (2.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

latticedb-0.2.1-py3-none-macosx_11_0_arm64.whl (668.2 kB view details)

Uploaded Python 3macOS 11.0+ ARM64

latticedb-0.2.1-py3-none-macosx_10_9_x86_64.whl (715.8 kB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file latticedb-0.2.1.tar.gz.

File metadata

  • Download URL: latticedb-0.2.1.tar.gz
  • Upload date:
  • Size: 25.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for latticedb-0.2.1.tar.gz
Algorithm Hash digest
SHA256 193a6fb8f826f0435978b97a5603d3d596c9f42813f52778d1cbf95da502104a
MD5 86a3f12c819cc71ddb6f60f93ff7ae31
BLAKE2b-256 5d28ac05ea06dd827dda214e63618f4a3aa46dd5f2490bcd9a708eaf3b7703f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.2.1.tar.gz:

Publisher: release.yml on jeffhajewski/latticedb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file latticedb-0.2.1-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for latticedb-0.2.1-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b3d1ee0819e135d347adf8fbe9ea005b29b4cd2bd563b3c2189acab70a466b2b
MD5 4b5721c47a0df83fe02c3ed609b7a0de
BLAKE2b-256 79dfbc40795778df0213b5953325985c71f1b21a365433cacd72f11efba08ad2

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.2.1-py3-none-manylinux_2_17_x86_64.whl:

Publisher: release.yml on jeffhajewski/latticedb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file latticedb-0.2.1-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for latticedb-0.2.1-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 f44915800174a0024657b34b805a4c2d6f80b4f1431881222ccd84dbf563cd97
MD5 5f20f33de01bc607544b1bba7f0a739d
BLAKE2b-256 65143a6b4bb7d79a85e59e00c5a32f751b5b09d3b761acd44e2cd4e1b581a19e

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.2.1-py3-none-manylinux_2_17_aarch64.whl:

Publisher: release.yml on jeffhajewski/latticedb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file latticedb-0.2.1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for latticedb-0.2.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 57828811cd3ced379286d61884642351e2b16192d808d1873d5f4c34f5342063
MD5 a9c2a6f21c6a14b5ea2a004a43c4b79f
BLAKE2b-256 baef22da3815c7d568aa28e78ff49483bbc81034d7ddc6ad8cd08c8a11646115

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.2.1-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on jeffhajewski/latticedb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file latticedb-0.2.1-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for latticedb-0.2.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6f35eadc5f803393e93dfe1cd0e347ef5697999603923427541cbf780dfd3c78
MD5 3ba764d2099d445f99f93328a7578600
BLAKE2b-256 8326e2cf3304ec58b118b18352a763fd1e19e802515c31823550bc51cd4a4add

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.2.1-py3-none-macosx_10_9_x86_64.whl:

Publisher: release.yml on jeffhajewski/latticedb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page