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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
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
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
250
setup-vp GitLab対応の裏側
naokihaba
0
160
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.3k
パスワード再設定メールのURLについて知っておこう
uyuki234
0
140
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
770
ActionController meets Protocol Buffers
sorah
0
150
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Simple Storage Service(S3) is not simple
iwatsukayura
0
260
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
180
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
150
Are APIs Still Relevant in the AI Era?
soyuka
0
460
最近”作らせてる” ローカルAIアプリの話
akit37
0
450
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
109
250k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Deep Space Network (abreviated)
tonyrice
0
360
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
600
Product Roadmaps are Hard
iamctodd
55
13k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
The Curious Case for Waylosing
cassininazir
1
570
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
370
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