2013-08-02 3 views
2

Cette requêteComment utiliser/dans une requête Datomic?

[:find ?p ?af 
:where [?p :person/age ?pa] 
     [?p :person/father ?f] 
     [?f :person/age ?fa] 
     [(/ ?pa ?fa) ?af]] 

retours seulement arrondis (à 0 décimales) valeurs pour ?af, donc je ne peux pas ajouter STH. comme

[(< 0.25 ?af)] 
[(< ?af 0.5)] 

à la clause where.

J'ai essayé des moulages à divers types dans la requête comme

[(double ?pa) ?pa2] 

mais cela affecte uniquement le type de résultat et ne supprime l'arrondissement.

Si vous connaissez quelque chose et que vous avez de l'expérience, j'ai un certain nombre de problèmes supplémentaires (surtout liés au type) avec Datomic. Cependant, je n'ai pas trouvé de solution de rechange pour ce problème de division (à l'exception de la division après interrogation) et j'espère vraiment que ce n'est pas dû à l'étape de développement précoce de Datomic. Je suppose que parce que Datomic ne supporte pas le type Ratio, ils sont arrondis, mais quelques décimales seraient vraiment bien. J'utilise Datomic avec Clojure.

EDIT J'ai trouvé une solution de rechange pour cela, mais j'aimerais quand même savoir pourquoi c'est nécessaire.

travail autour:

  • Utilisez clojure.core//

    [:find ?p ?af 
    :where [?p :person/age ?pa] 
         [?p :person/father ?f] 
         [?f :person/age ?fa] 
         [(clojure.core// ?pa ?fa) ?af]] 
    

Mais je veux certainement savoir qui/est appelé (lorsqu'elle est appelée sans un espace de noms complet) et où je peux trouver sa documentation pour que je puisse apprendre d'autres problèmes possibles avec d'autres opérateurs.

EDIT2: Appel d'une exception en concevant une requête à diviser par zéro, j'ai découvert que la méthode statique clojure.lang.Numbers/quotient est invoquée. Comment aurais-je dû le savoir? Il semble que Datomic ne soit pas opensource, au moins je ne pouvais pas trouver le code source dans le fichier jar. En utilisant clojure.tools.trace sur datomic.datalog, j'ai découvert que l'appel se produit en résolvant / de datomic.extensions. Dans datomic.extions, / est défini comme clojure.core/quot, qui appelle clojure.lang.Numbers/quotient.

Tout ceci n'est pas documenté en ce qui me concerne.

+0

J'ai été capable de reproduire votre problème. Cela ressemble à un "bug"/une "fonctionnalité" non documentée. – ponzao

+0

@ponzao: Merci de vous être procuré! Si c'est une caractéristique, leurs exemples sont vraiment trompeurs. Ils utilisent '*' comme je l'utilise sur ma calculatrice HP (http://docs.datomic.com/query.html). Je me suis enquis à ce sujet dans le groupe d'utilisateurs de Datomic hier et personne n'a encore répondu. –

Répondre

0

En effet, c'est une fonctionnalité non documentée. Stuart Halloway vient de confirmer cela dans le Datomic group:

Documentation pour les opérateurs disponibles dans la requête est manquante, comme vous découvert. Nous y travaillons, merci pour le rapport. L'opérateur/ n'effectue actuellement que des divisions entières, et nous cherchons sur des façons de rendre cela plus riche sans exposer les consommateurs à un type ( ) que la plupart des langages JVM ne possèdent pas.

En ce qui concerne la solution de contournement correcte, je garderai cette réponse à jour.

Questions connexes