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
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
540
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
6.7k
CSC307 Lecture 17
javiergs
PRO
0
320
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
Oxcを導入して開発体験が向上した話
yug1224
4
320
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.3k
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
250
Contextとはなにか
chiroruxx
1
330
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
Featured
See All Featured
Crafting Experiences
bethany
1
180
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
950
Why Our Code Smells
bkeepers
PRO
340
58k
Music & Morning Musume
bryan
47
7.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
720
New Earth Scene 8
popppiees
3
2.3k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
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