niamtokik / cozo

An interface to cozodb
https://github.com/niamtokik/cozo
BSD 2-Clause "Simplified" License
7 stars 1 forks source link
c cozo cozodb cozoscript database databases datalog db erlang nif relational-databases

cozo

Cozo License Cozo Top Language Cozo Workflow Status (master branch) Cozo Last Commit Cozo Code Size (bytes) Cozo Repository File Count Cozo Repository Size

An Erlang NIF wrapper for CozoDB, a FOSS embeddable, transactional, relational-graph-vector database, with time travelling capability, perfect as the long-term memory for LLMs and AI.

Support

Todo

Build

This project is using Makefile to extend the capability of rebar3. everything can be easily done with it.

make all
# or
make deps compile

Test

A full test suite is present in test/cozo_SUITE.erl file, using the cozodb tutorial present in the official documentation as template.

make test

Documentation

Generate the project documentation.

make doc

Open the documentation.

open doc/index.html

Notes are also available in notes directory. You can exported them in PDF, EPUB or HTML format if you have pandoc installed.

make notes

Usage

Open a shell with make

make shell

If you want to create a totally isolated database in its own process, you can use cozo_db module.

% open a new database in memory
{ok, Pid} = cozo_db:start([]).

% run a query
{ok,#{ <<"headers">> => [<<"_0">>,<<"_1">>,<<"_2">>],
       <<"next">> => null,
       <<"ok">> => true,
       <<"rows">> => [[1,2,3]],
       <<"took">> => 0.001401927
     }
} = cozo_db:run(Pid, "?[] <- [[1, 2, 3]]").

% close the database
ok = cozo_db:stop(Pid).

If you want to create more than one process and you don't care about isolation, you can use cozo module.

% open a new database in memory
{ok, Db} = cozo:open().

% run a query
{ok,#{ <<"headers">> => [<<"_0">>,<<"_1">>,<<"_2">>],
       <<"next">> => null,
       <<"ok">> => true,
       <<"rows">> => [[1,2,3]],
       <<"took">> => 0.001401927
     }
} = cozo:run(Db, "?[] <- [[1, 2, 3]]").

% close the database
ok = cozo:close(Db).

If you want an access to a low level interface, you can also use cozo_nif module.

Examples

Some examples are present in examples directory like a cozo over tcp, you can use with telnet or netcat.

c("examples/cozo_tcp.erl").
{ok, Pid} = cozo_tcp:start().
nc localhost 6543
# ?[] <- [[1,2,3]]

References