[JAVA] Tracez le tutoriel Datomic avec Datascript

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).

1. Installation

Ajoutez [datascript" 0.16.1 "] à : dependencies

2. Établissez une connexion


(require '[datascript.core :as dc])
(def con (dc/create-conn))

3. Schéma de transaction

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

Il 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}

4. Essayez de traiter les données

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}

5. Essayez de lancer une requête

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:

Essayez 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"}
  1. TODO

Recommended Posts

Tracez le tutoriel Datomic avec Datascript
Suivez le lien avec Selenium (Java)
[Tutoriel] Télécharger Eclipse → Lancer l'application avec Java (Pléiades)
[Rails] Didacticiel Apprendre avec les rails
Changer de port avec SpringBoot
Essayons le tutoriel S2Struts (# 3_180425)
Essayons le tutoriel S2Struts (# 5_180526)
Mock le constructeur avec PowerMock
Essayons le tutoriel S2Struts (# 4_180505)
Essayons le tutoriel S2Struts (# 1_180423)
Essayez le tutoriel Spring WebFlux
Avec l'erreur Cordova-> Looper.prepare ()