2016-08-12 1 views
2

Ich habe eine minimale Entität mit einem Attribut Bigint-Typ erstellt, mein Problem ist, dass die Abfrage für bestimmte Werte fehlschlagen; dies ist das Schema:Abfrage mit Bigint-Attribut zurückgeben für bestimmte Werte leer

[{:db/ident :home/area, 
    :db/valueType :db.type/bigint, 
    :db/cardinality :db.cardinality/one, 
    :db/doc "the doc", 
    :db.install/_attribute :db.part/db, 
    :db/id #db/id[:db.part/db -1000013]}] 

ich einen Abtastwert eingefügt:

(d/transact (d/connect uri2) 
      [{ 
       :db/id #db/id[:db.part/user] 
       :home/area 123456789000000N} 
      ]) 

Und bestätigt, dass es mit Hilfe der datomic Konsole erstellt wurde. Es kommt vor, dass die folgende Abfrage nicht die Entität zurückgibt vorher eingefügt, wie erwartet:

(d/q '[ 
     :find ?e 
     :in $ ?h 
     :where 
     [?e :home/area ?h]] 
    (d/db (d/connect uri2)) 
    123456789000000N 
    ) 
;;--- #{} 

Vielleicht etwas in der Art, wie ich bin fehlt der Wert ausgedrückt wird. Ein weiterer Test einen anderen Wert wie 100N für das Attribut: home/Bereich gibt die richtige Antwort:

(d/transact (d/connect uri2) 
      [{ 
       :db/id #db/id[:db.part/user] 
       :home/area 100N} 
      ]) 

(d/q '[ 
     :find ?e 
     :in $ ?h 
     :where 
     [?e :home/area ?h]] 
    (d/db (d/connect uri2)) 
    100N 
    ) 
;;-- #{[17592186045451]} 

auch funktioniert gut mit dem Wert 111111111111111111111111111111111111N, die ich ist verwirrend.

Datomic Version: "0.9.5390" java version "1.8.0_05" Java (TM) SE Runtime Environment (build 1.8.0_05-b13) Java HotSpot (TM) 64-Bit Server VM (build 25.5-b02, gemischter Modus) MySQL als Speicherdienst

Vielen Dank im Voraus für irgendwelche Vorschläge.

Antwort

1

Um Clojure Benutzer, der Name :db.type/bigint kann irreführend sein, da it actually maps-java.math.BigInteger, nicht clojure.lang.BigInt.

Ich reproduziert die gleichen Schritte, und ich kann Ihnen nicht sagen, warum die Datalog-Abfrage auf 123456789000000N, aber nicht 100N und 111111111111111111111111111111111111N schlägt fehl. Es scheint jedoch, dass Folgendes immer funktioniert:

(d/q '[ 
     :find ?e 
     :in $ ?h 
     :where 
     [?e :home/area ?h]] 
    (d/db (d/connect uri2)) 
    (.toBigInteger 100N) 
    ) 
+0

Ich habe die drei Beispiele geändert, die Ihrem Vorschlag folgen (verwenden Sie die Methode .toBigInteger) und alle funktionieren einwandfrei. Definitiv ist es mit dem Wert während der Query-Bindung verbunden. Ich werde weiter nach den Gründen suchen, aber ich kann diese Problemumgehung für mein Projekt verwenden. Danke Valentin –

1

Ich lief dein Beispiel und bekam unterschiedliche Ergebnisse (es funktionierte in allen Fällen). Ich bin mir nicht sicher, warum, aber vielleicht hilft das Hinzufügen meines Beispiels. Die einzigen Änderungen, die ich gemacht habe, waren uri anstelle von uri2, ich schlürfte das Schema, und ich führte eine (def conn (d/connect uri)) und eine (d/create-database uri). Ich nehme an, Sie Ähnliche Schritte durchgeführt, weshalb ich weiß nicht, warum mein Beispiel gearbeitet:

Clojure 1.8.0 
user=> (use '[datomic.api :only [q db] :as d]) 
nil 
user=> (use 'clojure.pprint) 
nil 
user=> (def uri "datomic:mem://bigint") 
#'user/uri 
user=> (d/create-database uri) 
true 
user=> (def conn (d/connect uri)) 
#'user/conn 
user=> (def schema-tx (read-string (slurp "path/to/the/schema.edn"))) 
#'user/schema-tx 
user=> @(d/transact conn schema-tx) 
{:db-before [email protected], 
     :db-after [email protected], 
:tx-data [#datom[13194139534312 50 #inst "2016-08-14T18:53:23.158-00:00" 13194139534312 true] 
     #datom[63 10 :home/area 13194139534312 true] #datom[63 40 60 13194139534312 true] 
     #datom[63 41 35 13194139534312 true] #datom[63 62 "the doc" 13194139534312 true] 
     #datom[0 13 63 13194139534312 true]], 
:tempids {-9223367638809264717 63}} 

(d/transact (d/connect uri) 
    [{ 
:db/id #db/id[:db.part/user] 
:home/area 123456789000000N} 
    ]) 
#object[datomic.promise$settable_future$reify__6480 0x5634d0f4 
    {:status :ready, :val {:db-before [email protected], 
             :db-after [email protected], 
          :tx-data [#datom[13194139534313 50 #inst "2016-08-14T18:53:34.325-00:00" 13194139534313 true] 
            #datom[17592186045418 63 123456789000000N 13194139534313 true]], 
          :tempids {-9223350046623220288 17592186045418}}}] 
(d/q '[ 
    :find ?e 
    :in $ ?h 
    :where 
    [?e :home/area ?h]] 
    (d/db (d/connect uri)) 
    123456789000000N 
    ) 
#{[17592186045418]} 

(d/transact (d/connect uri) 
    [{ 
:db/id #db/id[:db.part/user] 
:home/area 100N} 
    ]) 
#object[datomic.promise$settable_future$reify__6480 0x3b27b497 
    {:status :ready, :val {:db-before [email protected], 
             :db-after [email protected], 
          :tx-data [#datom[13194139534315 50 #inst "2016-08-14T18:54:13.347-00:00" 13194139534315 true] 
            #datom[17592186045420 63 100N 13194139534315 true]], 
          :tempids {-9223350046623220289 17592186045420}}}] 
(d/q '[ 
    :find ?e 
    :in $ ?h 
    :where 
    [?e :home/area ?h]] 
    (d/db (d/connect uri)) 
    100N 
    ) 
#{[17592186045420]} 
    user=> 

Können Sie (first schema-tx) auf der REPL Zeile Ihres Schema abgewickelt zu bestätigen? Ich habe bemerkt, dass du die Konsole benutzt hast und ich frage mich, ob /bigint nicht definiert wurde oder du die erste uri angesehen hast (da ich bemerkt habe, dass du eine 2 hast, gehe ich davon aus, dass du mehrere Beispiele hast).

+0

Jaret, ich habe alle Schritte ausgeführt, die du in deinem Code gezeigt hast, und alles funktioniert wie erwartet, also ist vielleicht etwas mit dem Speicher zu tun (du hast mem benutzt und ich benutze MySQL). Das Ergebnis von (erstes Schema-tx) ist übrigens: {: db/ident: home/Bereich,: db/valueType: db.type/bigint,: db/Kardinalität: db.cardinality/one,: db/doc "doc",: db.install/_attribute: db.part/db,: db/id # db/id [: db.part/db -1000013]} Ich bestätigte auch, dass das Schema erfolgreich erstellt wurde. –

+0

@ CésarCastillo Valentin Waeselynck hat Recht. Obwohl clojure.lang.BigInt und java.math.BigInteger in der Praxis weitgehend austauschbar sind, sieht es so aus, als ob die Datomic-Abfrage auf einer der Arten beruht, auf die sie sich unterscheiden. Wenn Sie stattdessen einen Java BigInteger an Ihre Abfrage übergeben, sollte es funktionieren. Die Speicherversion funktioniert, da sie dieselbe Objektinstanz verwendet. –

Verwandte Themen