Es handelt sich um eine OSS-Bibliothek, die API-kompatibel mit dem in der Clojure-Welt bekannten Produkt Datomic ist. Ich war an Datascript interessiert, also habe ich es berührt.
Als Thema werde ich Datomics Erste Schritte verfolgen.
Fügen Sie [Dataskript" 0.16.1 "]
zu : Abhängigkeiten
hinzu
(require '[datascript.core :as dc])
(def con (dc/create-conn))
In diesem Beispiel modellieren wir einen Film. Es wird angenommen, dass der Film ein Erscheinungsjahr, ein Genre und ein Titelattribut hat.
Folgendes ist erforderlich, um das Attribut zu definieren.
: db / ident
--: db / valueType
Der Datentyp, der vom Attribut gehalten wird: db / cardinality
einen einzelnen Wert haben oder eine Sammlung enthaltenEs wird auch empfohlen, ein Attribut docstring in einem der folgenden Elemente zu definieren: db / doc.
Das Attribut wird in der Karte der Daten definiert.
Der Titel ist wie folgt definiert
{:db/ident :movie/title
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The title of the movie"}
Das Genre ist wie folgt
{:db/ident :movie/genre
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The genre of the movie"}
Da das Veröffentlichungsjahr eine Ganzzahl ist, ändern Sie : db / valueType
in: db.type / long und definieren Sie Folgendes
{:db/ident :movie/release-year
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one
:db/doc "The year the movie was released in theaters"}
Schemata können einzeln abgewickelt werden, aber hier werden wir sie alle zusammen abwickeln.
(dc/transact con [{:db/ident :movie/title
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The title of the movie"}
{:db/ident :movie/genre
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The genre of the movie"}
{:db/ident :movie/release-year
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one
:db/doc "The year the movie was released in theaters"}])
Wenn Sie con bewerten, können Sie sehen, dass etwas drin ist.
user> con
#<Atom@4afb7219:
{1 :db/cardinality,
1 :db/doc,
1 :db/ident,
1 :db/valueType,
2 :db/cardinality,
2 :db/doc,
2 :db/ident,
2 :db/valueType,
3 :db/cardinality,
3 :db/doc,
3 :db/ident,
3 :db/valueType}
Definieren Sie die folgenden Daten
(def first-movies [{:movie/title "The Goonies"
:movie/genre "action/adventure"
:movie/release-year 1985}
{:movie/title "Commando"
:movie/genre "action/adventure"
:movie/release-year 1985}
{:movie/title "Repo Man"
:movie/genre "punk dystopia"
:movie/release-year 1984}])
Transaktion und Hinzufügen zur DB wie im Schema
(dc/transact con first-movies)
Wenn Sie con erneut bewerten, können Sie sehen, dass etwas zunimmt.
user> con
#<Atom@4afb7219:
{1 :db/cardinality,
1 :db/doc,
1 :db/ident,
1 :db/valueType,
2 :db/cardinality,
2 :db/doc,
2 :db/ident,
2 :db/valueType,
3 :db/cardinality,
3 :db/doc,
3 :db/ident,
3 :db/valueType,
4 :movie/genre,
4 :movie/release-year,
4 :movie/title,
5 :movie/genre,
5 :movie/release-year,
5 :movie/title,
6 :movie/genre,
6 :movie/release-year,
6 :movie/title}
Erstellen Sie zunächst aus der Verbindung etwas mit dem Namen "db".
(def db (dc/db con))
Diese Datenbank ist unveränderlich und gibt garantiert dieselben Ergebnisse für dieselbe Abfrage zurück (wahrscheinlich ein Punkt von Interesse).
Es gibt zwei Möglichkeiten, den Wert aus der Datenbank abzurufen:
query
Datalog
--pull
Informationen zur Unterhaltung deklarativ hierarchisieren und auswählenVersuchen Sie, die mit dem Attribut ": movie / title" in der Datenbank zu finden
(dc/q '[:find ?e
:where [?e :movie/title]]
db)
=>#{[4] [6] [5]}
Gehen Sie wie folgt vor, um den Filmtitel anstelle der Unterhaltungs-ID zu extrahieren
(dc/q '[:find ?movie-title
:where [_ :movie/title ?movie-title]]
db)
=> #{["The Goonies"] ["Commando"] ["Repo Man"]}
Holen Sie sich den Titel eines Films mit einem Erscheinungsjahr von 1985 wie folgt
(dc/q '[:find ?title
:where [?e :movie/title ?title]
[?e :movie/release-year 1985]]
db)
=>#{["The Goonies"] ["Commando"]}
Informationen zu allen Attributen von Filmen, die 1985 veröffentlicht wurden, sind wie folgt erhältlich:
(dc/q '[:find ?title ?year ?genre
:where [?e :movie/title ?title]
[?e :movie/release-year ?year]
[?e :movie/genre ?genre]
[?e :movie/release-year 1985]]
db)
=> #{["The Goonies" 1985 "action/adventure"]
["Commando" 1985 "action/adventure"]}
Verwenden Sie Pull wie folgt
(dc/pull db
'[*] ;;selector
4 ;; entity id
)
=>{:db/id 4,
:movie/genre "action/adventure",
:movie/release-year 1985,
:movie/title "The Goonies"}
Recommended Posts