Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Datalog: Data All Truth · Append Log · Obtain G...
Search
Norbert Wójtowicz
June 18, 2018
Programming
930
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
310
Reifying the Call Stack
pithyless
0
120
Data-Oriented Architecture (LambdaDays 2016)
pithyless
3
950
ClojureScript + React.js: How I learned to stop worrying and love the browser.
pithyless
1
560
Other Decks in Programming
See All in Programming
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
200
Event is what happens
moro
2
3.1k
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
15
8.3k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
14
11k
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
300
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
210
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
290
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
860
ChromeでローカルLLM
ryu1013
0
190
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
350
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
160
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.3k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
560
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
320
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
730
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1.1k
How to train your dragon (web standard)
notwaldorf
96
6.9k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Technical Leadership for Architectural Decision Making
baasie
3
630
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
Why Our Code Smells
bkeepers
PRO
340
58k
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