Skip to content

Instantly share code, notes, and snippets.

@vaughnd
Created September 12, 2012 10:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vaughnd/3705762 to your computer and use it in GitHub Desktop.
Save vaughnd/3705762 to your computer and use it in GitHub Desktop.
Datomic user->group memberships
(use '[datomic.api :only (q db) :as d])
(def uri "datomic:mem://user-groups2")
(d/create-database uri)
(def conn (d/connect uri))
(d/transact
conn
[{:db.install/_attribute :db.part/db
:db/id #db/id[:db.part/db]
:db/ident :user/name
:db/unique :db.unique/value
:db/index true
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db.install/_attribute :db.part/db
:db/id #db/id[:db.part/db]
:db/ident :group/name
:db/unique :db.unique/value
:db/index true
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db.install/_attribute :db.part/db
:db/id #db/id[:db.part/db]
:db/ident :user/memberships
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many}
])
(let [[chess-club tennis-club sally bob chris] (repeatedly #(d/tempid :db.part/user))]
(d/transact conn
[{:db/id chess-club :group/name "chess club"}
{:db/id tennis-club :group/name "tennis club"}
{:db/id sally :user/name "sally"}
{:db/id bob :user/name "bob"}
{:db/id chris :user/name "chris"}
{:db/id bob :user/memberships [chess-club tennis-club]}
{:db/id chris :user/memberships [chess-club]}
{:db/id sally :user/memberships [tennis-club]}]))
;; find sally
(q '[:find ?m :where [?m :user/name "sally"]] (db conn))
;; find everyone in chess club
(q '[:find ?un ?e :where [?g :group/name "chess club"] [?e :user/memberships ?g] [?e :user/name ?un]] (db conn))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment