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: Biting the Silver Bullet
Search
Norbert Wójtowicz
March 15, 2018
Programming
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Datalog: Biting the Silver Bullet
Norbert Wójtowicz
March 15, 2018
More Decks by Norbert Wójtowicz
See All by Norbert Wójtowicz
Datalog: Data All Truth · Append Log · Obtain Graph
pithyless
2
930
Reifying the Call Stack
pithyless
0
120
Data-Oriented Architecture (LambdaDays 2016)
pithyless
3
940
ClojureScript + React.js: How I learned to stop worrying and love the browser.
pithyless
1
560
Other Decks in Programming
See All in Programming
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
450
Jetpack Compose メカニズム
skydoves
0
370
巨大モノリシックアプリ モダン化大作戦
ktcryomm
0
990
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
140
Family mrubyの進捗
kishima
1
120
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.8k
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
230
Heart of Swift Concurrency
koher
0
560
iOSDC2026登壇資料.pdf
riofujimon
0
150
AHC070解法紹介
eijirou
0
110
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
How GitHub (no longer) Works
holman
316
150k
Un-Boring Meetings
codingconduct
0
420
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
850
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
Bash Introduction
62gerente
615
220k
Between Models and Reality
mayunak
4
450
So, you think you're a good person
axbom
PRO
2
2.2k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
600
Into the Great Unknown - MozCon
thekraken
41
2.7k
Transcript
Datalog: Biting the Silver Bullet 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
Data
Data
Data
Data
Data
Data
Data
Data
One-Way Data Flow Events → Log → Views
One-Way Data Flow Kafka → Batch → DBs
One-Way Data Flow Transactor → Storage → Peers
One-Way Data Flow Queue → Log → Indices
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]]
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]]
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 [: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 [: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 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
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 [: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 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
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 [: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
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 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 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 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-03-… 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-03-… 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-03-… 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-03-… 2000 2000 :tx/author Norbert 2000 2000 :tx/source GitHub import … 2000
Time Traveling (as-of db 3000) (as-of db #inst “2018-03-16”) (since
db #inst “2018-03-16”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-03-16”) (since
db #inst “2018-03-16”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-03-16”) (since
db #inst “2018-03-16”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-03-16”) (since
db #inst “2018-03-16”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-03-16”) (since
db #inst “2018-03-16”) (history db) (filter db #(not= :user/password (:a %))) (with db [{:user/name “awkay”}])
Time Traveling (as-of db 3000) (as-of db #inst “2018-03-16”) (since
db #inst “2018-03-16”) (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
Entity (q [:find ?repo :where [11 :repo/slug ?repo]] db)
Entity (q [:find ?repo ?sha :where [11 :repo/slug ?repo] [11
:repo/commits ?c] [?c :commit/sha ?sha]] db)
Entity (q [:find ?repo ?sha ?title :where [11 :repo/slug ?repo]
[11 :repo/commits ?c] [?c :commit/sha ?sha] [?c :commit/title ?title]] db)
Entity (def rich (entity db 11)) (:repo/slug rich) (map :commit/sha
(:repo/commits rich))
Entity (def rich (entity db 11)) (:repo/slug rich) (map :commit/sha
(:repo/commits rich))
Entity (def rich (entity db 11)) (:repo/slug rich) (map :commit/sha
(:repo/commits rich))
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 :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 ?p ?name)]] db [[(repo-owner ?p ?name) [?p :org/name ?name]] [(repo-owner ?p ?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-03-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-03-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
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