MusicBrainz Datomic

This article sets up a Datomic environment with the MusicBrainz sample database for easy exploration of the data with Datalog.

By reusing a Datomic environment, we have Datomic installed and can already start the transactor.

/usr/bin/nohup /datomic-free/bin/transactor /datomic-free/config/samples/free-transactor-template.properties &> /datomic-free.log & sleep 1
tail /datomic-free.log

Let's create a deps.edn file which brings in the datomic-free dependency with which we can connect to Datomic later.

{:deps
 {org.clojure/clojure {:mvn/version "1.10.0-beta8"}
  com.datomic/datomic-free {:mvn/version "0.9.5697"}
  org.clojure/tools.deps.alpha
  {:git/url "https://github.com/clojure/tools.deps.alpha.git"
   :sha "f6c080bd0049211021ea59e516d1785b08302515"}}}
deps.edn
Clojure

Download, unpack and import the MusicBrainz dataset:

wget --progress=bar:force https://s3.amazonaws.com/mbrainz/datomic-mbrainz-1968-1973-backup-2017-07-20.tar -O /results/mbrainz.tar
mbrainz.tar
tar -xf mbrainz.tar
/datomic-free/bin/datomic restore-db file:/mbrainz-1968-1973 datomic:free://localhost:4334/mbrainz-1968-1973

After this, we can already connect start querying the database from Clojure.

(require '[datomic.api :as d])

(def uri "datomic:free://localhost:4334/mbrainz-1968-1973")
(def conn (d/connect uri))

(def db (d/db conn))

(into [] (d/q '[:find ?title
 	:in $ ?artist-name
 :where
 [?a :artist/name ?artist-name]
 [?t :track/artists ?a]
 [?t :track/name ?title]]
     db "John Lennon"))

The environment built in this article is exported, so you can transclude it in your own articles, just remember to start the transactor in a bash cell as shown at the very top in this article.