Skip to content

Commit fb6e9cb

Browse files
committed
Upgrade to new Mundaneum, fix semantic notebook.
1 parent 66f38cf commit fb6e9cb

File tree

2 files changed

+47
-55
lines changed

2 files changed

+47
-55
lines changed

deps.edn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
;; semantic web goodies and box/arrow graphs
1919
jackrusher/mundaneum {:git/url "https://github.com/jackrusher/mundaneum/"
20-
:git/sha "84476918ee47b66a2d6128e1a90780e52fd2ae44"}
20+
:git/sha "d2c934a12388d88ddb3e53fef92ec2eef97d6140"}
2121
arrowic/arrowic {:mvn/version "0.1.1"}
2222

2323
;; 2D drawing routines

notebooks/semantic.clj

Lines changed: 46 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,23 @@
1313
(:require [clojure.string :as str]
1414
[nextjournal.clerk :as clerk]
1515
[nextjournal.clerk.viewer :as v]
16-
[mundaneum.query :refer [describe entity label property query]]
16+
[applied-science.mundaneum.properties :refer [wdt]]
17+
[applied-science.mundaneum.query :refer [describe entity label query]]
1718
[arrowic.core :as arr]))
1819

1920
;; Now we can ask questions, like "what is James Clerk Maxwell famous
2021
;; for having invented or discovered?"
2122

22-
(query '[:select ?what
23-
:where [[?what (wdt :discoverer-or-inventor) (entity "James Clerk Maxwell")]]])
23+
(query `{:select [?what]
24+
:where [[?what ~(wdt :discoverer-or-inventor) ~(entity "James Clerk Maxwell")]]})
2425

25-
;; The WikiData internal ID `Q1080745` doesn't immediately mean much
26+
;; The WikiData internal ID `:wd/Q1080745` doesn't immediately mean much
2627
;; to a human, so we'll try again by appending `Label` to the end of
2728
;; the `?what` logic variable so we can see a human readable label
2829
;; that item:
2930

30-
(query '[:select ?whatLabel
31-
:where [[?what (wdt :discoverer-or-inventor) (entity "James Clerk Maxwell")]]])
31+
(query `{:select [?whatLabel]
32+
:where [[?what ~(wdt :discoverer-or-inventor) ~(entity "James Clerk Maxwell")]]})
3233

3334
;; Ah, better. 😊 This ceremony is required because WikiData uses a
3435
;; language-neutral data representation internally, leaving us with an
@@ -37,9 +38,9 @@
3738
;; label in every language for which it has been specified in
3839
;; WikiData:
3940

40-
(query '[:select ?what ?label
41-
:where [[?what (wdt :discoverer-or-inventor) (entity "James Clerk Maxwell")]
42-
[?what rdfs:label ?label]]])
41+
(query `{:select [?what ?label]
42+
:where [[?what ~(wdt :discoverer-or-inventor) ~(entity "James Clerk Maxwell")]
43+
[?what :rdfs/label ?label]]})
4344

4445
;; One of the nice things about data encoded as a knowledge graph is
4546
;; that we can ask questions that are difficult to pose any other way,
@@ -49,10 +50,10 @@
4950
;; invented by anyone who has as one of their occupations "physicist":
5051

5152
(def inventions-and-discoveries
52-
(->> (query '[:select ?whatLabel ?whomLabel
53-
:where [[?what (wdt :discoverer-or-inventor) ?whom]
54-
[?whom (wdt :occupation) (entity "physicist")]]
55-
:limit 500])))
53+
(->> (query `{:select [?whatLabel ?whomLabel]
54+
:where [[?what ~(wdt :discoverer-or-inventor) ?whom]
55+
[?whom ~(wdt :occupation) ~(entity "physicist")]]
56+
:limit 500})))
5657

5758
;; ## Tabular data
5859

@@ -81,17 +82,19 @@
8182
;; language.
8283

8384
(def slavic-place-names
84-
(->> (query
85-
'[:select *
86-
:where [[?ort (wdt :instance-of) / (wdt :subclass-of) * (entity "human settlement")
87-
_ (wdt :country) (entity "Germany")
88-
_ rdfs:label ?name
89-
_ (wdt :coordinate-location) ?lonlat]
90-
:filter ((lang ?name) = "de")
91-
:filter ((regex ?name "(ow|itz)$"))]
92-
:limit 1000])
85+
(->> `{:select *
86+
:where [{?ort {(cat ~(wdt :instance-of) (* ~(wdt :subclass-of))) #{~(entity "human settlement")}
87+
~(wdt :country) #{~(entity "Germany")}
88+
:rdfs/label #{?name}
89+
~(wdt :coordinate-location) #{?lonlat}}}
90+
[:filter (= (lang ?name) "de")]
91+
[:filter (regex ?name "(ow|itz)$")]]
92+
:limit 1000}
93+
query
9394
;; cleanup lon-lat formatting for map plot!
94-
(mapv #(let [[lon lat] (-> (:lonlat %)
95+
(mapv #(let [[lon lat] (-> %
96+
:lonlat
97+
:value
9598
(str/replace #"[^0-9 \.]" "")
9699
(str/split #" "))]
97100
{:name (:name %) :latitude lat :longitude lon}))))
@@ -114,34 +117,23 @@
114117
:data {:values slavic-place-names}}]})
115118

116119
;; Sometimes the data needs a more customized view. Happily, we can
117-
;; write arbitrary hiccup to be rendered in Clerk. First, we'll make a
118-
;; helper function to convert the style of image url we receive from
119-
;; WikiData into proper Wiki Commons URLs with a fixed width:
120-
121-
(defn wiki-image
122-
"Helper that takes an image path `url` and creates a full wikimedia commons URL from it, optionally specifying a particular `width`."
123-
([url width] (str "https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/"
124-
url
125-
"&width="
126-
width))
127-
([url] (wiki-image url 300)))
128-
129-
;; And now we can use this query to fetch a list of different species
130-
;; of _Apodiformes_ (swifts and hummingbirds), returning a name,
131-
;; image, and map of home range for each one.
132-
133-
(->> (query '[:select :distinct ?item ?itemLabel ?pic ?range
134-
:where [[?item (wdt :parent-taxon) * (entity "Apodiformes")
135-
_ (wdt :taxon-rank) (entity "species")
136-
_ rdfs:label ?englishName
137-
_ (wdt :image) ?pic
138-
_ (wdt :taxon-range-map-image) ?range]
139-
:filter ((lang ?englishName) = "en")]
140-
:limit 10])
120+
;; write arbitrary hiccup to be rendered in Clerk. We'll use this
121+
;; query to fetch a list of different species of _Apodiformes_ (swifts
122+
;; and hummingbirds), returning a name, image, and map of home range
123+
;; for each one.
124+
125+
(->> (query `{:select-distinct [?item ?itemLabel ?pic ?range]
126+
:where [[?item (* ~(wdt :parent-taxon)) ~(entity "Apodiformes")]
127+
[?item ~(wdt :taxon-rank) ~(entity "species")]
128+
[?item :rdfs/label ?englishName]
129+
[?item ~(wdt :image) ?pic]
130+
[?item ~(wdt :taxon-range-map-image) ?range]
131+
[:filter (= (lang ?englishName) "en")]]
132+
:limit 11})
141133
(mapv #(vector :tr
142-
[:td (:itemLabel %)]
143-
[:td [:img {:src (wiki-image (:pic %))}]]
144-
[:td [:img {:src (wiki-image (:range %))}]]))
134+
[:td.w-32 (:itemLabel %)]
135+
[:td [:img.w-80 {:src (:pic %)}]]
136+
[:td [:img.w-80 {:src (:range %)}]]))
145137
(into [:table])
146138
clerk/html)
147139

@@ -161,10 +153,10 @@
161153
;; see all the languages.
162154

163155
(-> (clerk/html
164-
(let [data (query '[:select ?itemLabel ?influencedByLabel
165-
:where [[?item (wdt :influenced-by) * (entity "Lisp")
166-
_ (wdt :influenced-by) ?influencedBy]
167-
[?influencedBy (wdt :influenced-by) * (entity "Lisp")]]])]
156+
(let [data (query `{:select [?itemLabel ?influencedByLabel]
157+
:where [[?item (* ~(wdt :influenced-by)) ~(entity "Lisp")]
158+
[?item ~(wdt :influenced-by) ?influencedBy]
159+
[?influencedBy (* ~(wdt :influenced-by)) ~(entity "Lisp")]]})]
168160
(arr/as-svg
169161
(arr/with-graph (arr/create-graph)
170162
(let [vertex (->> (mapcat (juxt :itemLabel :influencedByLabel) data)

0 commit comments

Comments
 (0)