2015-08-05 2 views
4

Dans les exemples de données mbrainz, le: artiste/type est une énumération. Est-il possible de retirer la valeur de l'enum de: db/ident et de l'associer comme valeur de la clé: artist/type en utilisant la syntaxe pull?Possibilité d'obtenir une valeur enum via la syntaxe de pull de Datomic?

C'est aussi proche que je pouvais obtenir:

[:find (pull ?e [:artist/name {:artist/type [:db/ident]}]) 
:where 
[?e :artist/name "Ray Charles"] 
] 

;;=> [[{:artist/name "Ray Charles", :artist/type {:db/ident :artist.type/person}}]] 

Est-il possible d'utiliser la syntaxe de traction pour remodeler le résultat en quelque chose comme ça?

;;=> [[{:artist/name "Ray Charles", :artist/type :artist.type/person}]] 

Répondre

1

Je ne pense pas que vous pouvez le faire en utilisant l'API Pull comme vous le souhaitez. Vous trouverez peut-être qu'il est plus facile d'utiliser la bibliothèque Tupelo Datomic:

(require '[tupelo.datomic :as td] 
     '[tupelo.core :refer [spyx]]) 
(let [x1  (td/query-scalar :let  [$ db-val] 
           :find [ ?e ] 
           :where [ [?e :artist/name "Ray Charles"] ]) 
     x2  (td/entity-map db-val x1) 
    ] 
    (spyx x1) 
    (spyx x2) 
) 

qui donne le résultat:

x1 => 17592186049074

x2 => {: artiste/sortName « Charles, Ray ",: artiste/nom" Ray Charles ", : artiste/type: artiste.type/personne,: artiste/pays: pays/Etats-Unis, : artiste/gid #uuid" 2ce02909-598b-44ef-a456-151ba0a3bd70 ", : artiste/début de journée 23,: artiste/fin de journée 10,: artiste/débutAnnée 1930, : artiste/endMonth 6,: artiste/endYear 2004,: artiste/startMonth 9, : artiste/genre: artist.gender/mâle}

donc: artiste/type est déjà converti en: db/valeur d'identité et vous pouvez simplement le retirer de la carte.

+0

la bibliothèque mentionnée est un lien mort. – Kevin

+0

Correction, merci. –