This appendix is a lookup reference for public Datalevin helpers that sit around the main connection, transaction, query, pull, indexing, and provider APIs. For examples and rationale, use the narrative chapters referenced below. Host-language bindings follow the naming conventions and coverage notes in Appendix A.
1. Connection and DB Object Helpers
Function
Use
conn?
Returns true for an open Datalog connection.
closed?
Returns true when a connection is closed, nil, or points at a nil DB.
db
Returns the current Datalog DB object behind a connection. Call it again after writes.
opts
Returns the option map of the Datalog DB.
schema
Returns the current effective schema.
empty-db
Creates a raw Datalog DB object without wrapping it in an application connection.
datalog-kv
Returns the KV handle backing a Datalog connection or DB.
datalog-index-cache-limit
Gets or sets the Datalog index cache limit.
close
Closes a Datalog connection.
close-db
Closes a raw Datalog DB object.
with-conn
Clojure macro that opens or reuses a connection for a body and closes it afterward.
conn-from-db
Wraps an existing DB object in a mutable connection.
conn-from-datoms
Creates a connection from trusted datoms, with optional dir, schema, and opts.
reset-conn!
Replaces the contents of a connection with a supplied DB and returns a tx report.
Use get-conn or create-conn for normal application opening. datalog-kv returns a borrowed handle owned by the Datalog connection; close the connection, not the borrowed KV handle.
2. Pull Pattern Syntax Reference
Selector form
Meaning
[:user/name :user/email]
Pull named forward attributes.
[*], [:*], or ["*"]
Pull all forward attributes. Datalevin includes :db/id if the pattern does not name it.
[[:user/name :as :name]]
Rename a pulled value in the returned map.
[(:user/name :as :name)]
List-form attribute expressions are accepted for compatibility. Prefer vector expressions in new code.
[[:user/name :as :name :default "unknown"]]
Combine attribute options in one expression.
[[:user/friends :limit 5]]
Limit a cardinality-many attribute. Without an explicit limit, Datalevin returns at most 1000 values for a cardinality-many attribute. nil means no limit.
[[:user/active? :default true]]
Return a default value when the attribute is missing.
[[:user/name :xform clojure.string/upper-case]]
Transform the pulled value before returning it. Prefer resolvable symbols across process or language boundaries.
[{:order/customer [:user/name]}]
Follow a forward reference and pull a nested shape.
[{[:user/friends :limit 5] [:user/name]}]
Use an attribute expression as a nested map key.
[:order/_customer]
Pull reverse references for entities that point to the current entity.
[{:order/_customer [:order/id]}]
Pull a nested shape through a reverse reference.
[{:category/children ...}]
Recursively pull through a reference until no new entities remain.
[{:category/children "..."}]
String recursion marker; equivalent to ....
[{:category/children 2}]
Recursively pull through a reference with a positive depth limit.
[{:category/_children 2}]
Recursively pull through a reverse reference with a positive depth limit.
[(limit :user/friends 5)]
Legacy limit form. Prefer [[:user/friends :limit 5]] in new code.
[(default :user/nickname "unknown")]
Legacy default form. Prefer [[:user/nickname :default "unknown"]] in new code.
[(default (limit :user/friends 5) [])]
Legacy option forms may be nested or wrapped around attribute expressions; keep this shape for compatibility code only.
Pull patterns are EDN data. :limit applies only to cardinality-many attributes. Recursive pull tracks visited entities and represents cycles with {:db/id ...} rather than expanding forever. For multi-source Datalog queries, qualify pull with the source that owns the entity ids. Chapter 7 gives the worked examples.
3. Transaction Observation and Simulation
Function
Use
transact-async
Submits a Datalog transaction and returns a future/promise immediately.
transact
Blocks for the same asynchronous transaction machinery and returns an already realized future.
with-transaction
Groups multiple Datalog writes, and optionally borrowed KV writes, into one explicit transaction; accepts {:timeout-ms n} in the binding vector.
abort-transact
Aborts the open explicit Datalog transaction from inside with-transaction; also available through host-language bindings.
explicit-transaction-timeout
Gets or sets the default timeout, in milliseconds, for explicit Datalog and KV transactions.
set-explicit-transaction-timeout!
Sets or clears the default explicit transaction timeout; pass nil to disable it.
listen!, unlisten!
Register or remove transaction-report callbacks on a connection.
tx-data->simulated-report
Builds a transaction report from a DB object and tx data without mutating the connection.
resolve-tempid
Helper for looking up tempids in a transaction report.
update-schema
Applies explicit schema changes, deletions, or renames to an open connection.
listen! replaces an existing callback when the same key is registered again. A simulated report has the normal report shape, including :new-attributes when the tx data introduce attributes not already present in the schema. Chapter 6 covers transaction semantics and callbacks.
4. Datom, Entity, and Type Helpers
Function
Use
db?
Tests whether a value is a Datalog DB object and refreshes a stale DB cache when needed.
datom
Creates a raw datom for trusted low-level import APIs such as init-db and fill-db.
datom?
Tests whether a value is a Datalevin datom.
datom-e, datom-a, datom-v
Return the entity, attribute, or value component of a datom.
entity
Returns a lazy, map-like entity for an eid or lookup ref.
entid
Resolves a lookup ref to a numeric eid, returns nil when it does not exist, and returns numeric eids unchanged.
entity-db
Returns the DB object from which an entity was created.
touch
Eagerly realizes an entity's forward attributes, mainly for REPL inspection and debugging.
add, retract
Clojure transactable-entity helpers for staging additions or retractions on an entity before transacting it.
Application transactions should normally use maps or transaction datom vectors. Raw datoms are for trusted bulk-loading paths. Lazy entity reads are available across Clojure, Java, Python, and JavaScript; staged entity mutation is Clojure-only.
5. Datalog Index, Statistics, and Bulk Helpers
Function
Use
datoms
Reads datoms from a named index, currently :eav or :ave, using supplied leading key components.
search-datoms
Describes an (e, a, v) pattern with nil wildcards and lets Datalevin choose an efficient index.
count-datoms
Counts datoms matching an (e, a, v) wildcard pattern without realizing the datoms.
cardinality
Counts distinct current values for one attribute. This is a statistic, not the schema property :db/cardinality.
max-eid
Returns the current maximum entity id, useful when a bulk import allocates numeric eids.
seek-datoms, rseek-datoms
Starts a forward or reverse index cursor near a supplied key prefix.
index-range
Reads the AVE range for one attribute between lower and upper bounds.
fulltext-datoms
Runs a full-text query and returns matching datoms rather than shaped search results; accepts search options such as :top, :limit, and :offset.
analyze
Refreshes attribute statistics used by the query planner.
init-db
Creates a database quickly from trusted prepared datoms.
fill-db
Adds trusted prepared datoms to an existing DB object.
re-index
Dumps, clears, reloads, and rebuilds a Datalog store, KV store, search engine, or vector index with supplied options.
init-db and fill-db bypass ordinary transaction processing and the WAL transaction log; use them only with trusted prepared datoms. Chapter 15 covers direct index reads, Chapter 20 covers bulk loading, and Chapter 21 covers analyze.
re-index closes, dumps, clears, reloads, and rebuilds the supplied store or index. Call it only when no other threads or programs are accessing the same database or index. Pass :backup? true to create a temporary backup named dtlv-re-index-<timestamp> in the system temporary directory. Search-engine re-indexing requires the search engine to have stored source text with :include-text? true.
6. Secondary Index Job Helpers
Function
Use
secondary-index-status
Returns async secondary-index job status for a local Datalog connection.
process-secondary-index-jobs!
Processes pending jobs, with options such as :max-jobs and :retry-failed?.
wait-for-secondary-index
Waits until matching secondary-index jobs are complete, with options such as :tx, :type, :domain, :timeout-ms, :poll-ms, :process?, :max-jobs, and :retry-failed?.
These helpers apply to domains configured for async full-text, vector, or embedding indexing. Synchronous domains update the secondary index before the transaction returns. Binding coverage for these helpers is listed in the language compatibility matrix linked from Appendix A.
7. Standalone Search and Vector Helpers
7.1 Full-Text Search
Function
Use
new-search-engine
Creates a full-text search engine backed by an open-kv handle.
add-doc, remove-doc, clear-docs
Add, remove, or clear indexed documents.
doc-indexed?, doc-count
Inspect document presence and document count.
search
Runs a full-text query and returns refs, scores, offsets, or stored texts depending on :display.
search-index-writer, write, commit
Bulk-writer API for faster standalone search indexing. Call commit after all write calls.
7.2 Vector Search
Function
Use
new-vector-index
Creates an HNSW vector index backed by an open-kv handle.
Persist or inspect the vector checkpoint stored in LMDB.
close-vector-index, clear-vector-index
Close index resources, or close and delete all vectors.
Use Datalog full-text, vector, embedding, or idoc attributes when search results should participate in entity modeling and transactions. Use standalone engines for direct KV-backed search and vector indexes. Chapters 16 and 17 own the tutorial coverage.
8. Direct Provider Helpers
8.1 Embedding Providers
Function
Use
new-embedding-provider
Creates a local or OpenAI-compatible embedding provider.
embedding-metadata
Returns stable metadata describing the embedding space.
embedding-dimensions
Returns the vector dimension count.
embed-text, embed-texts
Embed one string or a batch of strings.
token-count, token-counts
Count embedding input tokens.
truncate-item, truncate-text
Truncate input to fit a token limit.
close-embedding-provider
Releases provider resources. Safe to call more than once.
8.2 LLM Providers
Function
Use
new-llm-provider
Creates a local llama.cpp generation provider.
llm-metadata
Returns metadata for the configured LLM provider.
llm-context-size
Returns the model context size.
generate-text
Generates completion text for a prompt.
summarize-text
Summarizes an input string.
llm-token-count
Counts tokens for one LLM input string.
close-llm-provider
Releases provider resources. Safe to call more than once.
Provider helpers are direct model calls. Persisted facts, episodes, embeddings, summaries, and provenance are ordinary application data.
9. Small Utility Helpers
Function
Use
tempid
Datomic-compatibility helper for negative tempids; :db.part/tx resolves to :db/current-tx. Prefer explicit negative ids when possible.
squuid, squuid-time-millis
Semi-sequential UUID helpers. Use application identity attributes for durable domain identity.
read-csv
Reads CSV data from a string or reader into lazy vectors of strings.
write-csv
Writes CSV rows to a writer.
hexify-string, unhexify-string
Encode a string as hex text and decode it back.
10. Python and JavaScript Schema Builders
These binding-level helpers build ordinary schema and option maps. They are most useful where the host language needs a typed helper instead of writing EDN by hand. Chapter 14 shows them in context.
Helper
Use
idoc_attr / idocAttr
Python and JavaScript helpers for building a :db.type/idoc schema attribute map. They accept idoc-specific options such as format, domain, indexed_paths / indexedPaths, and excluded_paths / excludedPaths, plus common schema attribute keys.
idoc_domain / idocDomain
Python and JavaScript helpers for building an idoc domain/default option map for :idoc-opts or an entry under :idoc-domains. They accept indexed_paths / indexedPaths, excluded_paths / excludedPaths, and extra.
11. Other Public API Namespaces
Namespace
Main use
datalevin.interpret
Interpreted functions and code execution for CLI, pods, remote calls, transaction functions, and KV visitor functions.
datalevin.udf
Runtime registry and descriptor handling for descriptor-backed user-defined functions.
datalevin.constants
Selected stable defaults, documented tuning vars, and system constants shared by the implementation.
datalevin.main
Programmatic support for the dtlv command-line tool.
11.1 datalevin.interpret
Var
Use
load-edn
Loads EDN forms from a file in Datalevin's interpreter, often for schema or setup data.
exec-code
Executes a string of Datalevin REPL-compatible code and prints results.
inter-fn
Creates a serializable interpreted function.
definterfn
Defines a named inter-fn.
inter-fn?
Tests whether a value is an interpreted function.
inter-fn-from-reader
Reads a printed interpreted function back into a callable value.
11.2 datalevin.udf
Descriptor key
Meaning
:udf/lang
Descriptor namespace used in the registry key and resolver lookup, often the implementation language, such as :clojure, :java, :python, :javascript, or an application-defined keyword.
:udf/kind
Function role, such as :tx-fn, :query-fn, or :predicate.
:udf/id
Stable function id keyword.
:udf/version
Optional keyword, string, or integer version.
Function
Use
descriptor?, descriptor
Test or validate descriptor maps.
create-registry
Creates a mutable UDF registry atom.
generation
Returns the registry generation, which changes after registration updates.
register!
Registers a descriptor to a callable value.
register-resolver!
Registers a language-level resolver that can materialize functions on demand.
unregister!, registered?, registered-descriptor
Manage or inspect registry entries.
ensure-kind, descriptor-or-registered
Validate that a descriptor/id is suitable for a query, predicate, or transaction context.
materialize, resolve
Resolve a descriptor to a callable function.
Use datalevin.interpret/inter-fn when embedded Clojure source should travel with a transaction or query. Use datalevin.udf when a host application should look up functions by descriptor.
11.3 Selected datalevin.constants Vars
The constants namespace contains more implementation constants than this table lists. This is a selected index of public defaults and tuning vars that readers are most likely to encounter in examples, diagnostics, or operational tuning.
Var
Use
version
Current Datalevin version string.
default-env-flags
Default LMDB environment flags for open-kv.
default-dbi-flags
Default DBI flags, including :create, :counted, and :prefix-compression.
Full-text search writer batch sizes without and with position indexing.
Prefer documented option maps and API functions over persisting implementation constants in application data. Consult the API docs or source when you need the complete current set of constants for a specific release.
11.4 datalevin.main
Function
Use
exec
Executes Datalevin code supplied as command-line style argument strings.
copy
Copies a database directory, optionally compacting while copying.
drop
Drops or clears named key-value DBIs in a database directory.
dump
Dumps Datalog or key-value database content.
load
Loads Datalog or key-value content into a database directory.
-main
Entry point for the dtlv command, dispatching copy, drop, dump, exec, help, load, mcp, pods, repl, serv, and stat.
default-root-dir
Default server root directory used by the CLI.
When neither --datalog nor explicit DBI names are supplied, dump and load use auto mode. Auto mode detects a Datalog store and writes a mixed text dump: the Datalog options, schema, and datoms, followed by user-created KV DBIs in the same LMDB environment. This is the right export/import path for a Datalog database that also keeps application state through datalog-kv. Datalevin skips its own internal and derived Datalog DBIs, so full-text, vector, embedding, and idoc indexes are treated as rebuildable indexes rather than separate user data.
Use --datalog when you intentionally want only the Datalog schema and datoms. Use --all or explicit DBI names when you want raw KV dumps. Mixed Datalog/KV auto dump is a text format; for Nippy binary dumps, choose an explicit Datalog or KV mode.