Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Datalog: Data All Truth · Append Log · Obtain G...
Search
Norbert Wójtowicz
June 18, 2018
Programming
900
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Datalog: Data All Truth · Append Log · Obtain Graph
Norbert Wójtowicz
June 18, 2018
More Decks by Norbert Wójtowicz
See All by Norbert Wójtowicz
Datalog: Biting the Silver Bullet
pithyless
0
290
Reifying the Call Stack
pithyless
0
110
Data-Oriented Architecture (LambdaDays 2016)
pithyless
3
940
ClojureScript + React.js: How I learned to stop worrying and love the browser.
pithyless
1
550
Other Decks in Programming
See All in Programming
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
6.6k
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
170
スマートグラスで並列バイブコーディング
hyshu
0
150
さぁV100、メモリをお食べ・・・
nilpe
0
140
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5.4k
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
240
Vite+ Unified Toolchain for the Web
naokihaba
0
320
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
180
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
270
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
720
Site-Speed That Sticks
csswizardry
13
1.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
My Coaching Mixtape
mlcsv
0
150
Ruling the World: When Life Gets Gamed
codingconduct
0
260
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Transcript
Datalog Data All Truth · Append Log · Obtain Graph
Norbert Wójtowicz · @pithyless
! " # Information Systems
! " # DATA Information Systems
D A T A ! " # 1 D,T 2
A DATA Information Systems
D A T A ! " # 1 D,T 2
A DATA Information Systems
Data Stream · Tree · Mesh
⦾→⦾→⦾→⦾ Data · Stream
Data · Tree
Data · Mesh
Data · Mesh
Data · Mesh
Data · Mesh
Data · Mesh
Data · Mesh
Data · Mesh
One-Way Data Flow Queue → Log → Views
One-Way Data Flow Kafka → Batch → DBs
One-Way Data Flow Transactor → Storage → Peers
One-Way Data Flow Event → Log → Views
Datalog Entity · Attribute · Value
GitHub
Entity · Attribute · Value e a v [entity attribute
value]
Entity · Attribute · Value [entity attribute value] {:user/name “richhickey”}
{:user/name “tonsky”} {:user/name “pithyless”} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Entity · Attribute · Value [entity attribute value] {:user/name “richhickey”}
{:user/name “tonsky”} {:user/name “pithyless”} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Entity · Attribute · Value [entity attribute value] {:user/name “richhickey”}
{:user/name “tonsky”} {:user/name “pithyless”} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Constants [11 _ _] [_ _ “pithyless”]
[_ :user/name _] [22 :user/name “tonsky”] [11 :user/name “tonsky”] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Constants [11 _ _] [_ _ “pithyless”]
[_ :user/name _] [22 :user/name “tonsky”] [11 :user/name “tonsky”] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Constants [11 _ _] [_ _ “pithyless”]
[_ :user/name _] [22 :user/name “tonsky”] [11 :user/name “tonsky”] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Constants [11 _ _] [_ _ “pithyless”]
[_ :user/name _] [22 :user/name “tonsky”] [11 :user/name “tonsky”] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Constants [11 _ _] [_ _ “pithyless”]
[_ :user/name _] [22 :user/name “tonsky”] [11 :user/name “tonsky”] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Bindings [?e _ _] [_ ?a _]
[_ _ ?v] [?e ?a _] [?e _ ?v] [?e ?a ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Bindings [?e _ _] [_ ?a _]
[_ _ ?v] [?e ?a _] [?e _ ?v] [?e ?a ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Bindings [?e _ _] [_ ?a _]
[_ _ ?v] [?e ?a _] [?e _ ?v] [?e ?a ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Bindings [?e _ _] [_ ?a _]
[_ _ ?v] [?e ?a _] [?e _ ?v] [?e ?a ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Bindings [?e _ _] [_ ?a _]
[_ _ ?v] [?e ?a _] [?e _ ?v] [?e ?a ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Bindings [?e _ _] [_ ?a _]
[_ _ ?v] [?e ?a _] [?e _ ?v] [?e ?a ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Mix & Match [?e :user/name “pithyless”] [11
:user/name ?v] [?e :user/name ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Mix & Match [?e :user/name “pithyless”] [11
:user/name ?v] [?e :user/name ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Pattern Matching - Mix & Match [?e :user/name “pithyless”] [11
:user/name ?v] [?e :user/name ?v] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Basic Query [:find ?name :where [11 :user/name ?name]] e a
v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Basic Query [:find ?name :where [11 :user/name ?name]] e a
v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Basic Query e a v 11 :user/name richhickey 22 :user/name
tonsky 33 :user/name pithyless [:find ?name :where [11 :user/name ?name]] ∈{[“richhickey”]}
Basic Query [:find ?id :where [?id :user/name “tonsky”]] e a
v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Basic Query [:find ?id :where [?id :user/name “tonsky”]] e a
v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Basic Query [:find ?id :where [?id :user/name “tonsky”]] e a
v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless ∈{[22]}
Sets [:find ?name :where [_ :user/name ?name]] e a v
11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Sets [:find ?name :where [_ :user/name ?name]] e a v
11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless [:find ?name :where [_ :user/name ?name]] ∈{[“richhickey”] [“tonsky”] [“pithyless”]} Sets
Sets [:find ?attr :where [_ ?attr _]] e a v
11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless ∈{[:user/name]} Sets [:find ?attr :where [_ ?attr _]]
Sets · Lists · Scalars [:find ?name :where [_ :user/name
?name]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless [:find ?name :where [_ :user/name ?name]] ∈{[“richhickey”] [“tonsky”] [“pithyless”]} Sets · Lists · Scalars
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless [:find [?name ...] :where [_ :user/name ?name]] [“richhickey” “tonsky” “pithyless”] Sets · Lists · Scalars
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless [:find ?name . :where [_ :user/name ?name]] “tonsky” Sets · Lists · Scalars
Multiple Bindings [:find ?id ?name :where [?id :user/name ?name]] e
a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Multiple Bindings [:find ?id ?name :where [?id :user/name ?name]] e
a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
Multiple Bindings [:find ?id ?name :where [?id :user/name ?name]] e
a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless
∈{[11 “richhickey”] [22 “tonsky”] [33 “pithyless”]} [:find ?id ?name :where
[?id :user/name ?name]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless Multiple Bindings
Entity {:user/name “richhickey” :user/email “
[email protected]
”} {:user/name “tonsky” :user/email “
[email protected]
"} {:user/name
“pithyless” :user/email “
[email protected]
”} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
Entity {:user/name “richhickey” :user/email “
[email protected]
”} {:user/name “tonsky” :user/email “
[email protected]
"} {:user/name
“pithyless” :user/email “
[email protected]
”} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
Entity {:user/name “richhickey” :user/email “
[email protected]
”} {:user/name “tonsky” :user/email “
[email protected]
"} {:user/name
“pithyless” :user/email “
[email protected]
”} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
Entity {:user/name “richhickey” :user/email “
[email protected]
”} {:user/name “tonsky” :user/email “
[email protected]
"} {:user/name
“pithyless” :user/email “
[email protected]
”} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
Join e a v 11 :user/name richhickey 22 :user/name tonsky
33 :user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?email :where [?id :user/name “richhickey”] [?id :user/email ?email]]
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?email :where [?id :user/name “richhickey”] [?id :user/email ?email]] Join
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?email :where [?id :user/name “richhickey”] [?id :user/email ?email]] Join
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?email :where [?id :user/name “richhickey”] [?id :user/email ?email]] Join
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?email :where [?id :user/name “richhickey”] [?id :user/email ?email]] ∈{[“
[email protected]
”]} Join
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?name :where [?id :user/name ?name] [?id :user/email “
[email protected]
”]] ∈{[“richhickey”]} Join
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?name :where [?id :user/name ?name] [?id :user/email “fake”]] ∈{} Join
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 11 :user/email
[email protected]
22 :user/email
[email protected]
33 :user/email
[email protected]
[:find ?name ?email :where [?id :user/name ?name] [?id :user/email ?email]] ∈{[“richhickey” “
[email protected]
”] [“tonsky” “
[email protected]
”] [“pithyless” “
[email protected]
”]} Join
Reference {:org/name “clojure”} {:repo/slug "clojure/clojure" :repo/owner 44} {:repo/slug "tonsky/datascript" :repo/owner
22} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22
Reference {:org/name “clojure”} {:repo/slug "clojure/clojure" :repo/owner 44} {:repo/slug "tonsky/datascript" :repo/owner
22} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22
Reference {:org/name “clojure”} {:repo/slug "clojure/clojure" :repo/owner 44} {:repo/slug "tonsky/datascript" :repo/owner
22} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22
Reference {:org/name “clojure”} {:repo/slug "clojure/clojure" :repo/owner 44} {:repo/slug "tonsky/datascript" :repo/owner
22} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22
Reference - Ident e a v 11 :user/name richhickey 22
:user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 {:org/name “clojure”} {:repo/slug "clojure/clojure" :repo/owner [:org/name “clojure”]} {:repo/slug "tonsky/datascript" :repo/owner [:user/name “tonsky"]}
Follow References [:find ?repo :where [?p :user/name “tonsky”] [?r :repo/owner
?p] [?r :repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22
[:find ?repo :where [?p :user/name “tonsky”] [?r :repo/owner ?p] [?r
:repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 Follow References
[:find ?repo :where [?p :user/name “tonsky”] [?r :repo/owner ?p] [?r
:repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 Follow References
[:find ?repo :where [?p :user/name “tonsky”] [?r :repo/owner ?p] [?r
:repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 Follow References
[:find ?repo :where [?p :user/name “tonsky”] [?r :repo/owner ?p] [?r
:repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 ∈{[“tonsky/datascript”]} Follow References
[:find ?name :where [?p :user/name ?name] [?r :repo/owner ?p] [?r
:repo/slug “tonsky/datascript”]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 ∈{[“tonsky”]} Follow References - Reverse
Polymorphic References [:find ?name ?repo :where [?p :user/name ?name] [?r
:repo/owner ?p] [?r :repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 ∈{[“tonsky” “tonsky/datascript”]}
Polymorphic References [:find ?name ?repo :where [?p :org/name ?name] [?r
:repo/owner ?p] [?r :repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 ∈{[“clojure” “clojure/clojure”]}
Polymorphic References [:find ?name ?repo :where (or [?p :org/name ?name]
[?p :user/name ?name]) [?r :repo/owner ?p] [?r :repo/slug ?repo]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 ∈{[“tonsky” “tonsky/datascript”] [“clojure” “clojure/clojure”]}
Rules [:find ?name ?repo :where [(repo-owner ?p ?name)] [?r :repo/owner
?p] [?r :repo/slug ?repo]] [[(repo-owner ?p ?name) [?p :org/name ?name]] [(repo-owner ?p ?name) [?p :user/name ?name]]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22
Circular References {:repo/slug “pithyless/datascript" :repo/owner [:user/name “pithyless"] :repo/fork [:repo/slug "tonsky/datascript"]}
e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
Circular References {:repo/slug “pithyless/datascript" :repo/owner [:user/name “pithyless"] :repo/fork [:repo/slug "tonsky/datascript"]}
e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
Find forks [:find ?repo :where [?r :repo/slug ?repo] [?r :repo/fork
_]] ∈{[“pithyless/datascript”]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
Find originals [:find ?repo :where [?r :repo/slug ?repo] [(missing ?r
:repo/fork)]] ∈{[“clojure/clojure”] [“tonsky/datascript”]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
List forks [:find ?orig ?fork :where [?orig-id :repo/slug ?orig] [?fork-id
:repo/slug ?fork] [?fork-id :repo/fork ?orig-id]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
List forks [:find ?orig ?fork :where [?orig-id :repo/slug ?orig] [?fork-id
:repo/slug ?fork] [?fork-id :repo/fork ?orig-id]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
List forks [:find ?orig ?fork :where [?orig-id :repo/slug ?orig] [?fork-id
:repo/slug ?fork] [?fork-id :repo/fork ?orig-id]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
List forks [:find ?orig ?fork :where [?orig-id :repo/slug ?orig] [?fork-id
:repo/slug ?fork] [?fork-id :repo/fork ?orig-id]] ∈{[“tonsky/datascript” “pithyless/datascript”]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 44 :org/name clojure 55 :repo/slug clojure/clojure 55 :repo/owner 44 66 :repo/slug tonsky/datascript 66 :repo/owner 22 77 :repo/slug pithyless/datascript 77 :repo/owner 33 77 :repo/fork 66
Multiple Values {:repo/slug "clojure/clojure" :repo/lang [“clojure” “java”]} {:repo/slug "tonsky/datascript" :repo/lang
[“clojure” “javascript”]} {:repo/slug "pithyless/datascript" :repo/lang [“clojure” “javascript”]} e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 55 :repo/lang clojure 55 :repo/lang javascript 55 :repo/lang clojure 55 :repo/lang javascript
Multiple Values {:repo/slug "clojure/clojure" :repo/lang [“clojure” “java”]} {:repo/slug "tonsky/datascript" :repo/lang
[“clojure” “javascript”]} {:repo/slug "pithyless/datascript" :repo/lang [“clojure” “javascript”]} e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 55 :repo/lang clojure 55 :repo/lang javascript 55 :repo/lang clojure 55 :repo/lang javascript
Multiple Values {:repo/slug "clojure/clojure" :repo/lang [“clojure” “java”]} {:repo/slug "tonsky/datascript" :repo/lang
[“clojure” “javascript”]} {:repo/slug "pithyless/datascript" :repo/lang [“clojure” “javascript”]} e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 55 :repo/lang clojure 55 :repo/lang javascript
Multiple Values {:repo/slug "clojure/clojure" :repo/lang [“clojure” “java”]} {:repo/slug "tonsky/datascript" :repo/lang
[“clojure” “javascript”]} {:repo/slug "pithyless/datascript" :repo/lang [“clojure” “javascript”]} e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript
Multiple Values e a v 55 :repo/slug clojure/clojure 66 :repo/slug
tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript [:find ?lang :where [_ :repo/lang ?lang]]
e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77
:repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript [:find ?lang :where [_ :repo/lang ?lang]] Multiple Values
e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77
:repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript [:find ?lang :where [_ :repo/lang ?lang]] ∈{[“clojure”] [“java”] [“javascript”]} Multiple Values
Multiple Values [:find ?repo ?lang :where [?r :repo/slug ?repo] [?r
:repo/lang ?lang]] e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript
[:find ?repo ?lang :where [?r :repo/slug ?repo] [?r :repo/lang ?lang]]
e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript Multiple Values
[:find ?repo ?lang :where [?r :repo/slug ?repo] [?r :repo/lang ?lang]]
e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript Multiple Values
[:find ?repo ?lang :where [?r :repo/slug ?repo] [?r :repo/lang ?lang]]
e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript Multiple Values
[:find ?repo ?lang :where [?r :repo/slug ?repo] [?r :repo/lang ?lang]]
e a v 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript Multiple Values
Multiple Values e a v 55 :repo/slug clojure/clojure 66 :repo/slug
tonsky/datascript 77 :repo/slug pithyless/datascript 55 :repo/lang clojure 55 :repo/lang java 66 :repo/lang clojure 66 :repo/lang javascript 77 :repo/lang clojure 77 :repo/lang javascript [:find ?repo ?lang :where [?r :repo/slug ?repo] [?r :repo/lang ?lang]] ∈{[“clojure/clojure” “clojure”] [“clojure/clojure” “java”] [“tonsky/datascript” “clojure”] [“tonsky/datascript” “javascript”] [“pithyless/datascript” “clojure”] [“pithyless/datascript” “javascript”]}
Multiple References {:user/name "richhickey" :user/stars [[:repo/slug “clojure/clojure"]]} {:user/name "tonsky" :user/stars
[[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} {:user/name “pithyless" :user/stars [[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66
Multiple References {:user/name "richhickey" :user/stars [[:repo/slug “clojure/clojure"]]} {:user/name "tonsky" :user/stars
[[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} {:user/name “pithyless" :user/stars [[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66
Multiple References {:user/name "richhickey" :user/stars [[:repo/slug “clojure/clojure"]]} {:user/name "tonsky" :user/stars
[[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} {:user/name “pithyless" :user/stars [[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66
Multiple References {:user/name "richhickey" :user/stars [[:repo/slug “clojure/clojure"]]} {:user/name "tonsky" :user/stars
[[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} {:user/name “pithyless" :user/stars [[:repo/slug "clojure/clojure"] [:repo/slug “tonsky/datascript"]]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66
Aggregations [:find ?repo (count ?p) :where [?r :repo/slug ?repo] [?p
:user/stars ?r]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66
[:find ?repo (count ?p) :where [?r :repo/slug ?repo] [?p :user/stars
?r]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66 Aggregations
[:find ?repo (count ?p) :where [?r :repo/slug ?repo] [?p :user/stars
?r]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66 Aggregations
[:find ?repo (count ?p) :where [?r :repo/slug ?repo] [?p :user/stars
?r]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66 Aggregations
[:find ?repo (count ?p) :where [?r :repo/slug ?repo] [?p :user/stars
?r]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66 Aggregations
Aggregations e a v 11 :user/name richhickey 22 :user/name tonsky
33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript 11 :user/stars 55 22 :user/stars 55 22 :user/stars 66 33 :user/stars 55 33 :user/stars 66 ∈{[“clojure/clojure” 3] [“tonsky/datascript” 2]} [:find ?repo (count ?p) :where [?r :repo/slug ?repo] [?p :user/stars ?r]]
Predicates [:find ?repo :where [_ :repo/slug ?repo] [(.startsWith ?repo “c”)]]
e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript
[:find ?repo :where [_ :repo/slug ?repo] [(.startsWith ?repo “c”)]] e
a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript Predicates
Predicates [:find ?repo :where [_ :repo/slug ?repo] [(.startsWith ?repo “c”)]]
e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript
Predicates ∈{[“clojure/clojure”]} e a v 11 :user/name richhickey 22 :user/name
tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript [:find ?repo :where [_ :repo/slug ?repo] [(.startsWith ?repo “c”)]]
Fulltext Search [:find ?repo ?score :where [(fulltext :repo/slug “clojure”) [[?r
?repo _ ?score]]] e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript
Fulltext Search [:find ?repo ?score :where [(fulltext :repo/slug “clojure”) [[?r
?repo _ ?score]]] ∈{[“clojure/clojure” 0.99]} e a v 11 :user/name richhickey 22 :user/name tonsky 33 :user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript
Coffee?
Datalog Entity · Attribute · Value
e a v 11 :user/name richhickey 22 :user/name tonsky 33
:user/name pithyless 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript Databases as Indices
Databases as Indices Structure Index key/value A · V ·
E row E · A · V column A · E · V document E · A · V graph V · A · E search inverted-index
Key / Value [:find ?repo :where [_ :repo/slug ?repo]] a
v e :repo/slug clojure/clojure 55 :repo/slug pithyless/datascript 77 :repo/slug tonsky/datascript 66 :user/name pithyless 33 :user/name richhickey 11 :user/name tonsky 22 :user/stars 55 11 :user/stars 55 22 :user/stars 55 33 :user/stars 66 22 :user/stars 66 33
Row [:find ?name :where [11 :user/name ?name]] e a v
11 :user/name richhickey 11 :user/stars 55 22 :user/name tonsky 22 :user/stars 55 22 :user/stars 66 33 :user/name pithyless 33 :user/stars 55 33 :user/stars 66 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript
Column [:find ?p (count ?p) :where [?p :user/stars _]] a
e v :repo/slug 55 clojure/clojure :repo/slug 66 tonsky/datascript :repo/slug 77 pithyless/datascript :user/name 11 richhickey :user/name 22 tonsky :user/name 33 pithyless :user/stars 11 55 :user/stars 22 55 :user/stars 22 66 :user/stars 33 55 :user/stars 33 66
Document [:find ?repo :where [11 :user/stars ?r] [?r :repo/slug ?repo]
e a v 11 :user/name richhickey 11 :user/stars 55 22 :user/name tonsky 22 :user/stars 55 22 :user/stars 66 33 :user/name pithyless 33 :user/stars 55 33 :user/stars 66 55 :repo/slug clojure/clojure 66 :repo/slug tonsky/datascript 77 :repo/slug pithyless/datascript
Graph [:find ?e :where [?e :user/stars ?r] [?r :repo/slug “clojure/clojure”]
v a e 55 :user/stars 11 55 :user/stars 22 55 :user/stars 33 66 :user/stars 22 66 :user/stars 33 clojure/clojure :repo/slug 55 pithyless :user/name 33 pithyless/datascript :repo/slug 77 richhickey :user/name 11 tonsky :user/name 22 tonsky/datascript :repo/slug 66
Databases as Indices Structure Index key/value A · V ·
E row E · A · V column A · E · V document E · A · V graph V · A · E search inverted-index
Reified Attributes 11 :user/name richhickey 2 :db/ident :user/name 2 :db/valueType
:db.type/string 2 :db/doc “GitHub username” 2 :db/unique :db.unique/identity 2 :db/fulltext true
Reified Attributes 11 2 richhickey 2 :db/ident :user/name 2 :db/valueType
:db.type/string 2 :db/doc “GitHub username” 2 :db/unique :db.unique/identity 2 :db/fulltext true
Reified Attributes 11 2 richhickey 2 :db/ident :user/name 2 :db/valueType
:db.type/string 2 :db/doc “GitHub username” 2 :db/unique :db.unique/identity 2 :db/fulltext true
Reified Attributes 11 2 richhickey 2 :db/ident :user/name 2 :db/valueType
:db.type/string 2 :db/doc “GitHub username” 2 :db/unique :db.unique/identity 2 :db/fulltext true
Reified Attributes 11 2 richhickey 2 :db/ident :user/name 2 :db/valueType
:db.type/string 2 :db/doc “GitHub username” 2 :db/unique :db.unique/identity 2 :db/fulltext true
Reified Attributes 11 2 richhickey 2 :db/ident :user/name 2 :db/valueType
:db.type/string 2 :db/doc “GitHub username” 2 :db/unique :db.unique/identity 2 :db/fulltext true
Transactions [entity attribute value] e a v 11 :user/name richhickey
22 :user/name tonsky 33 :user/name pithyless
Transactions [entity attribute value transaction operation] e a v tx
op 11 :user/name richhickey 1000 true 22 :user/name tonsky 1000 true 33 :user/name pithyless 2000 true
e a v tx op 11 :user/name richhickey 1000 true
22 :user/name tonsky 1000 true 33 :user/name pithyless 2000 true Transactions · Assert
e a v tx op 11 :user/name richhickey 1000 true
22 :user/name tonsky 1000 true 33 :user/name pithyless 2000 true 99 :user/name awkay 3000 true Transactions · Assert
e a v tx op 11 :user/name richhickey 1000 true
22 :user/name tonsky 1000 true 33 :user/name pithyless 2000 true Transactions · Retract
e a v tx op 11 :user/name richhickey 1000 true
22 :user/name tonsky 1000 true 33 :user/name pithyless 2000 true 22 :user/name tonsky 3000 false Transactions · Retract
e a v tx op 11 :user/name richhickey 1000 true
22 :user/name tonsky 1000 true 33 :user/name pithyless 2000 true Transactions · Update
e a v tx op 11 :user/name richhickey 1000 true
22 :user/name tonsky 1000 true 33 :user/name pithyless 2000 true 22 :user/name tonsky 3000 false 22 :user/name nikita 3000 true Transactions · Update
Reified Transactions e a v tx 33 :user/name pithyless 2000
2000 :db/txInstant 2018-04-… 2000 2000 :tx/author Norbert 2000 2000 :tx/source GitHub import … 2000
Reified Transactions e a v tx 33 :user/name pithyless 2000
2000 :db/txInstant 2018-04-… 2000 2000 :tx/author Norbert 2000 2000 :tx/source GitHub import … 2000
Reified Transactions e a v tx 33 :user/name pithyless 2000
2000 :db/txInstant 2018-04-… 2000 2000 :tx/author Norbert 2000 2000 :tx/source GitHub import … 2000
Reified Transactions e a v tx 33 :user/name pithyless 2000
2000 :db/txInstant 2018-04-… 2000 2000 :tx/author Norbert 2000 2000 :tx/source GitHub import … 2000
Time Traveling (as-of db 3000) (as-of db #inst “2018-04-17”) (since
db #inst “2018-04-17”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-04-17”) (since
db #inst “2018-04-17”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-04-17”) (since
db #inst “2018-04-17”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-04-17”) (since
db #inst “2018-04-17”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-04-17”) (since
db #inst “2018-04-17”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-04-17”) (since
db #inst “2018-04-17”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Components e a v 66 :repo/slug tonsky/datascript 110 :commit/sha aaaaaa
110 :commit/title Release 0.16.2 110 :commit/email
[email protected]
66 :git/commits 110 {:repo/slug “tonsky/datascript" :git/commits [{:commit/sha "aaaaaa" :commit/title "Release 0.16.2" :commit/email "
[email protected]
"}]}
Components e a v 66 :repo/slug tonsky/datascript 110 :commit/sha aaaaaa
110 :commit/title Release 0.16.2 110 :commit/email
[email protected]
66 :git/commits 110 {:repo/slug “tonsky/datascript" :git/commits [{:commit/sha "aaaaaa" :commit/title "Release 0.16.2" :commit/email "
[email protected]
"}]}
Components {:repo/slug "clojure/clojure" :git/commits [{:commit/sha "bbbbbb" :commit/title "Release 1.8.0" :commit/email
"
[email protected]
"} {:commit/sha "cccccc" :commit/title "Release 1.9.0” :commit/email "
[email protected]
"} {:commit/sha "dddddd" :commit/title "Fix bugs" :commit/email “
[email protected]
"}]} e a v 55 :repo/slug clojure/clojure 120 :commit/sha bbbbbb 120 :commit/title Release 1.8.0 120 :commit/email
[email protected]
55 :git/commits 120 130 :commit/sha cccccc 130 :commit/title Release 1.9.0 130 :commit/email
[email protected]
55 :git/commits 130 140 :commit/sha dddddd 140 :commit/title Fix bugs 140 :commit/email
[email protected]
55 :git/commits 140
Components {:repo/slug "clojure/clojure" :git/commits [{:commit/sha "bbbbbb" :commit/title "Release 1.8.0" :commit/email
"
[email protected]
"} {:commit/sha "cccccc" :commit/title "Release 1.9.0” :commit/email "
[email protected]
"} {:commit/sha "dddddd" :commit/title "Fix bugs" :commit/email “
[email protected]
"}]} e a v 55 :repo/slug clojure/clojure 120 :commit/sha bbbbbb 120 :commit/title Release 1.8.0 120 :commit/email
[email protected]
55 :git/commits 120 130 :commit/sha cccccc 130 :commit/title Release 1.9.0 130 :commit/email
[email protected]
55 :git/commits 130 140 :commit/sha dddddd 140 :commit/title Fix bugs 140 :commit/email
[email protected]
55 :git/commits 140
Components {:repo/slug "clojure/clojure" :git/commits [{:commit/sha "bbbbbb" :commit/title "Release 1.8.0" :commit/email
"
[email protected]
"} {:commit/sha "cccccc" :commit/title "Release 1.9.0” :commit/email "
[email protected]
"} {:commit/sha "dddddd" :commit/title "Fix bugs" :commit/email “
[email protected]
"}]} e a v 55 :repo/slug clojure/clojure 120 :commit/sha bbbbbb 120 :commit/title Release 1.8.0 120 :commit/email
[email protected]
55 :git/commits 120 130 :commit/sha cccccc 130 :commit/title Release 1.9.0 130 :commit/email
[email protected]
55 :git/commits 130 140 :commit/sha dddddd 140 :commit/title Fix bugs 140 :commit/email
[email protected]
55 :git/commits 140
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
Pull API [:find (pull ?e query) :where [?e :repo/slug “clojure/clojure”]]
[:repo/slug :repo/langs {:repo/owner [:user/name :org/name {:repo/_owner [(:repo/langs :limit 1) {:repo/commits [:commit/sha]}]}]}] [{:repo/slug "clojure/clojure" :repo/langs ["clojure" "java"] :repo/owner {:org/name "clojure" :repo/_owner [{:repo/langs ["clojure"] :repo/commits [{:commit/sha "bbbbbb"} {:commit/sha "cccccc"} {:commit/sha “dddddd"} ]}]}}]
And now for something completely different
Event Sourcing $ # %
Datomic
Datomic
Datascript
Pull API & " ' ! (
Pull API % (
Appendices
Parameterized Query [:find ?name :where [11 :user/name ?name]]
Parameterized Query · Database (q [:find ?name :where [11 :user/name
?name]] (db conn))
Parameterized Query · Database q([:find ?name :where [11 :user/name ?name]],
db(conn))
Parameterized Query · Database (q [:find ?name :where [11 :user/name
?name]] (db conn))
Parameterized Query · Database (q [:find ?name :where [11 :user/name
?name]] (db conn))
Parameterized Query · Database (q [:find ?name :in $ :where
[11 :user/name ?name]] (db conn))
Parameterized Query · Template (q [:find ?name :in $ ?id
:where [?id :user/name ?name]] (db conn) 11)
Parameterized Query · Template (q [:find ?name :in $ [?id
...] :where [?id :user/name ?name]] (db conn) [11 22 33])
Parameterized Query · Template (q [:find ?name :in $ ?id
?name :where [?id :user/name ?name]] (db conn) 11 “richhickey”)
Parameterized Query · Rules (q [:find ?name :in $ %
:where [(repo-owner ?name)]] db [[(repo-owner ?name) [?p :org/name ?name]] [(repo-owner ?name) [?p :user/name ?name]]])
Parameterized Query · Database (q [:find ?name (count ?id) :where
[?id :user/name ?name] [?id :user/stars _] (since (db conn) #inst “2018-04-01”))
Parameterized Query · Database (q [:find ?name (count ?id) :in
$db $since :where [$db ?id :user/name ?name] [$since ?id :user/stars _] (db conn) (since (db conn) #inst “2018-04-01”)
Parameterized Query · Aggregates (q [:find (avg ?age) :where [_
:user/age ?age] (db conn))
Parameterized Query · Aggregates (q [:find (avg ?age) :with ?e
:where [?e :user/age ?age] (db conn))
{:db-before {:database-id "58a47389-f1ab-4d81-85b6-715cecde9bac", :t 1000, :next-t 1001, :history false}, :db-after
{:database-id "58a47389-f1ab-4d81-85b6-715cecde9bac", :t 1001, :next-t 1005, :history false}, :tx-data [ #datom[13194139534317 50 #inst “2017-02-15T19:28:52.270-00:00" 13194139534317 true] #datom[17592186045422 63 "The Goonies" 13194139534317 true] #datom[17592186045422 64 "action/adventure" 13194139534317 true] #datom[17592186045422 65 1985 13194139534317 true] #datom[17592186045423 63 "Commando" 13194139534317 true] #datom[17592186045423 64 "action/adventure" 13194139534317 true] #datom[17592186045423 65 1985 13194139534317 true] ], :tempids {-9223301668109598138 17592186045422, -9223301668109598137 17592186045423, -9223301668109598136 17592186045424}} Transaction Report
Graph BFS https://hashrocket.com/blog/posts /using-datomic-as-a-graph-database
Sort ?
Sort (let [initial (q [:find ?e ?c :where [?e :repo/slug
?c]] db) sorted (map first (sort-by second initial)) result (pull-many db ‘[*] sorted)] result)
Sort (let [initial (q [:find ?e ?c :where [?e :repo/slug
?c]] db) sorted (map first (sort-by second initial)) result (pull-many db ‘[*] sorted)] result)
Sort (let [initial (q [:find ?e ?c :where [?e :repo/slug
?c]] db) sorted (map first (sort-by second initial)) result (pull-many db ‘[*] sorted)] result)
Performance * :db/noHistory * clause order
Performance * :db/noHistory * clause order * excise
Armchair Philosophy * schema change (accrete) * global unique keywords
* data immutability
Armchair Philosophy * schema change (accrete) * global unique keywords
* data immutability
Armchair Philosophy * schema change (accrete) * global unique keywords
* data immutability
Fini bit.ly/datalog-gist