A graph database written in rust.
IndraDB consists of a server and an underlying library. Most users would use the server, which is available via releases as pre-compiled binaries. But if you're a rust developer that wants to embed a graph database directly in your application, you can use the library.
IndraDB's original design is heavily inspired by TAO, facebook's graph datastore. In particular, IndraDB emphasizes simplicity of implementation and query semantics, and is similarly designed with the assumption that it may be representing a graph large enough that full graph processing is not possible. IndraDB departs from TAO (and most graph databases) in its support for properties.
For more details, see the homepage. See also a complete demo of IndraDB for browsing the wikipedia article link graph.
We offer pre-compiled releases for linux and macOS.
This should start the default datastore.
To build and install from source:
git clone firstname.lastname@example.org:indradb/indradb.git.
If you want to run IndraDB in docker, follow the below instructions.
Build the image for the server:
DOCKER_BUILDKIT=1 docker build --target server -t indradb-server .
Run the server:
docker run --network host --rm indradb-server -a 0.0.0.0:27615
Build the image for the client:
DOCKER_BUILDKIT=1 docker build --target client -t indradb-client .
Run the client:
docker run --network host --rm indradb-client grpc://localhost:27615 ping
IndraDB offers several different datastores with trade-offs in durability, transaction capabilities, and performance.
By default, IndraDB starts a datastore that stores all values in-memory. This is the fastest implementation, but there's no support for graphs larger than what can fit in-memory, and data is only persisted to disk when explicitly requested.
If you want to use the standard datastore without support for persistence, don't pass a subcommand; e.g.:
If you want to use the standard datastore but persist to disk:
indradb-server memory --persist-path=[/path/to/memory/image.bincode]
You'll need to explicitly call
Sync() when you want to save the graph.
If you want to use the rocksdb-backed datastore, use the
rocksdb subcommand; e.g.:
indradb-server rocksdb [/path/to/rocksdb.rdb] [options]
It's possible to develop other datastores implementations in separate crates, since the IndraDB exposes the necessary traits to implement:
The IndraDB server includes support for plugins to extend functionality available to clients. Plugins are loaded via dynamically linked libraries.
To include plugins, see the
--plugins argument for
indradb-server --plugins=plugins/*.so. They are then callable via the gRPC
make test to run the test suite. Note that this will run the full test suite across the entire workspace, including tests for all datastore implementations. You can filter which tests run via the
TEST_NAME environment variable. e.g.
TEST_NAME=create_vertex make test will run tests with
create_vertex in the name across all datastore implementations. All unit tests will run in CI.
Microbenchmarks can be run via
A fuzzer is available, ensuring the the RocksDB and in-memory datastores operate identically. Run it via
Lint and formatting checks can be run via
make check. Equivalent checks will be run in CI.