Il s'agit d'une bibliothèque OSS compatible API avec le produit appelé Datomic, qui est célèbre dans le monde de Clojure. J'étais intéressé par Datascript, alors je l'ai touché.
En tant que sujet, je tracerai le [Getting Started] de Datomic (http://docs.datomic.com/getting-started/transact-schema.html).
Ajoutez [datascript" 0.16.1 "]
à : dependencies
(require '[datascript.core :as dc])
(def con (dc/create-conn))
Dans cet exemple, nous modélisons un film. On suppose que le film a une année de sortie, un genre et un attribut de titre.
Les éléments suivants sont nécessaires pour définir l'attribut.
--Nom unique de l'attribut : db / ident
--: db / valueType
Le type de données détenues par l'attribut
: db / cardinality
ont une valeur unique ou contiennent une collectionIl est également recommandé de définir un attribut docstring dans any: db / doc.
L'attribut est défini dans la carte des données.
Le titre est défini comme suit
{:db/ident :movie/title
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The title of the movie"}
Le genre est le suivant
{:db/ident :movie/genre
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/doc "The genre of the movie"}
Étant donné que l'année de publication est un entier, remplacez : db / valueType
par: db.type / long et définissez-le comme suit
{: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"}
Les schémas peuvent être traités un par un, mais ici nous les traiterons tous ensemble.
(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"}])
Si vous évaluez con, vous pouvez voir qu'il y a quelque chose dedans.
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}
Définissez les données suivantes
(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}])
Transaction et ajout à la base de données comme un schéma
(dc/transact con first-movies)
Si vous évaluez à nouveau con, vous pouvez voir que quelque chose augmente.
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}
Tout d'abord, créez quelque chose appelé «db» à partir de la connexion.
(def db (dc/db con))
Cette base de données est immuable et est garantie de renvoyer les mêmes résultats pour la même requête (probablement un point d'intérêt).
Il existe deux façons d'obtenir la valeur de la base de données:
query
Datalog
--pull
Hiérarchiser et sélectionner de manière déclarative les informations sur le divertissementEssayez de trouver celui avec l'attribut : movie / title
dans la base de données
(dc/q '[:find ?e
:where [?e :movie/title]]
db)
=>#{[4] [6] [5]}
Pour extraire le titre du film au lieu de l'ID de divertissement, procédez comme suit
(dc/q '[:find ?movie-title
:where [_ :movie/title ?movie-title]]
db)
=> #{["The Goonies"] ["Commando"] ["Repo Man"]}
Obtenez le titre d'un film avec une année de sortie 1985 comme suit
(dc/q '[:find ?title
:where [?e :movie/title ?title]
[?e :movie/release-year 1985]]
db)
=>#{["The Goonies"] ["Commando"]}
Les informations sur tous les attributs des films sortis en 1985 peuvent être obtenues comme suit:
(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"]}
Utilisez pull comme suit
(dc/pull db
'[*] ;;selector
4 ;; entity id
)
=>{:db/id 4,
:movie/genre "action/adventure",
:movie/release-year 1985,
:movie/title "The Goonies"}
Recommended Posts