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.3.0.tar.gz (29.4 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.3.0-py3-none-manylinux_2_17_x86_64.whl (2.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

latticedb-0.3.0-py3-none-manylinux_2_17_aarch64.whl (2.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

latticedb-0.3.0-py3-none-macosx_11_0_arm64.whl (699.0 kB view details)

Uploaded Python 3macOS 11.0+ ARM64

latticedb-0.3.0-py3-none-macosx_10_9_x86_64.whl (748.8 kB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

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

File hashes

Hashes for latticedb-0.3.0.tar.gz
Algorithm Hash digest
SHA256 357ba5ae0c5e2c982189acc06eb7f73408c907840a5f2bbab4bb0960a3448b32
MD5 527276cac10170ebd195a69a573a966a
BLAKE2b-256 5995acfac7c1dcd53b0cffbbf73563b845e1ede533935d5f9545784b3ade6416

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.3.0.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.3.0-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for latticedb-0.3.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 aef32de91a0f3819e02af7bdf913c3fe9dd8c25839da6ee724825031d2fd1e7d
MD5 fd7a101bdb6a31c13340d3fd66fa2cb4
BLAKE2b-256 cf6f6a7d48d107a5fb1409cc4afae1d8d8cc2e5cdae9a2458e44bfda559ff268

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.3.0-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.3.0-py3-none-manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for latticedb-0.3.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 18a7543c9d2ec27984e0b62b936fd3328c873a91c58d22e41c04eff11785793c
MD5 dce807cb004ba424c4517ccc8dc77807
BLAKE2b-256 4ec8e9a1eeac57d0be01ebadf4baf6cf55b66005e940f11f9b0dca2e41b801dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.3.0-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.3.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for latticedb-0.3.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7caa5d90f677c4702ebb986e23ad0e200d99acbe6f6c7ae9e9cffa6a7c2e088
MD5 0a883557e225731de4713bb2ac0c6395
BLAKE2b-256 c5ed2dbda4f73f99df933572eb6db548e85c3b37834c5815b3cc4d923715ce7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.3.0-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.3.0-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for latticedb-0.3.0-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fcea56b9106a2b3dd930f65f4388c6ca5e558d4b8b5a93ec821eef0dd18bea2e
MD5 a12eb786b0b716858c7044d415620d10
BLAKE2b-256 45050d615a4769032658c5e5c9cc0e5fd98d70fe89b3297dcf9cd6eaf1cf46b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for latticedb-0.3.0-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