Elixir driver for ArangoDB
Clone or download
beno beno
beno and beno Version 0.6.1
Latest commit 882c425 Jun 25, 2017
Type Name Latest commit message Commit time
Failed to load latest commit information.
config use xarango_env db Nov 7, 2016
lib Accept queryresult Jun 26, 2017
test 0.6.0 tests Jun 23, 2017
.editorconfig remove trailing spaces and add .editorconfig Feb 26, 2017
.gitignore first pass Oct 25, 2016
LICENSE update package spec Oct 26, 2016
README.md Version 0.6.1 Jun 26, 2017
mix.exs Version 0.6.1 Jun 26, 2017
mix.lock Update. dependencies Jun 13, 2017



Elixir client library for ArangoDB.

Xarango has a low level API that maps directly to the Arango REST API. On top of that sits a Domain API, intended for use in applications. Examples below.


Configure xarango in config/config.exs:

    config :xarango, :db,
      server: "http://localhost:8529",
      database: "test_db",
      username: System.get_env("ARANGO_USER"),
      password: System.get_env("ARANGO_PASSWORD")

Set your credentials:

$ export ARANGO_USER=root
$ export ARANGO_PASSWORD=secret

Run tests:

mix test # <= beware: running tests will destroy all data in the configured database.


defmodule Article, do: use Xarango.Domain.Document

lorem = Article.create(%{author: "Author", text: "Lorem"})
ipsum = Article.create(%{author: "Author", text: "Ipsum"})

IO.inspect lorem[:text] #=> "Lorem"

Article.one(%{author: "Author"}) #=> %Article{...}
Article.list(%{author: "Author"}) #=> %Xarango.QueryResult{result: [%Article{...}, %Article{...}]}
Article.list(%{}, [sort: :author, per_page: 10] #=> serial pagination with cursor (fast)
Article.list(%{}, [sort: :author, dir: :desc, per_page: 10, page: 1] #=> pagination with page nrs (skip, limit)

Article.search(:text, "ips"}) #=> [%Article{..}]

Article.update(ipsum, %{status: "review"})
Article.replace(lorem, %{author: "Author", text: "Foo"})



defmodule Brand, do: use Xarango.Domain.Node
defmodule Car, do: use Xarango.Domain.Node, graph: Vehicles, collection: :all_cars
defmodule Vehicles do
  use Xarango.Domain.Graph

  relationship Car, :made_by, Brand

subaru = Brand.create(%{name: "Subaru"}, graph: Vehicles)
outback = Car.create(%{type: "Outback"})
impreza = Car.create(%{type: "Impreza"})

subaru[:name] #=> "Subaru"
outback[:type] #=> "Outback"

Vehicles.add_made_by(outback, subaru)
Vehicles.add(impreza, :made_by, subaru)

Vehicles.car_made_by(subaru) #=> [%Car{...}, %Car{...}] #outbound edges for car
Vehicles.get(Car, :made_by, subaru) #=> [%Car{...}, %Car{...}]

Vehicles.made_by_brand(outback) #=> [%Brand{...}]
Vehicles.get(outback, :made_by, Brand) #=> [%Brand{...}

Vehicles.remove_made_by(impreza, subaru)
Vehicles.remove(outback, :made_by, subaru)

Car.search(:name, "imp") #=> [%Car{...}]


defmodule Brand, do: use Xarango.Domain.Node, graph: Vehicles
defmodule Car, do: use Xarango.Domain.Node, graph: Vehicles
defmodule Vehicles do
  use Xarango.Domain.Graph

  relationship Car, :made_by, Brand

alias Xarango.Transaction

|> Transaction.create(Car, %{name: "Foo"}, var: :car1)
|> Transaction.create(Car, %{name: "Bar"}, var: :car2)
|> Transaction.create(Brand, %{name: "Baz"}, var: :brand)
|> Transaction.add(:car1, :made_by, :brand)
|> Transaction.add(:car2, :made_by, :brand)
|> Transaction.get(Car, :made_by, :brand)
|> Transaction.execute #=> [%Car{vertex: ...}, %Car{vertex: ...}]

Low level API

See tests for low level usage examples.


  • Transactions
  • Graph operations
  • Full text search
  • AQL support, query builder
  • waitForSync option


The package can be installed as:

  1. Add xarango to your list of dependencies in mix.exs:
def deps do
  [{:xarango, "~> 0.6.1"}]
  1. Ensure xarango is started before your application:
def application do
  [applications: [:xarango]]