2016-06-08 3 views
2

ich über die Datomic Pull Syntax las hier:Datomic Pull Ausdruck

http://docs.datomic.com/pull.html

Und es erklärt unter Wildcard, die ein Muster wie [*] wird eine Einheit ziehen und zieht rekursiv seine Entitätsattribute. Wörtliches Zitat:

Die Wildcard-Spezifikation * zieht alle Attribute eines Unternehmens und zieht rekursiv jede Komponente Attribute:

;; pattern 
[*] 

;; result 
{:release/name "The Concert for Bangla Desh", 
:release/artists [{:db/id 17592186049854}], 
:release/country {:db/id 17592186045504}, 
:release/gid #uuid "f3bdff34-9a85-4adc-a014-922eef9cdaa5", 
:release/day 20, 
:release/status "Official", 
:release/month 12, 
:release/artistCredit "George Harrison", 
:db/id 17592186072003, 
:release/year 1971, 
:release/media 
[{:db/id 17592186072004, 
    :medium/format {:db/id 17592186045741}, 
    :medium/position 1, 
    :medium/trackCount 2, 
    :medium/tracks 
    [{:db/id 17592186072005, 
    :track/duration 376000, 
    :track/name "George Harrison/Ravi Shankar Introduction", 
    :track/position 1, 
    :track/artists [{:db/id 17592186048829} {:db/id 17592186049854}]} 
    {:db/id 17592186072006, 
    :track/duration 979000, 
    :track/name "Bangla Dhun", 
    :track/position 2, 
    :track/artists [{:db/id 17592186048829}]}]} 
    ... 
    ]} 

Allerdings, wenn ich dies selbst versuche ich nur db/id Werte für ref Arten. Ich muss im Grunde in eine ausführlichere Weise jede ref Art rufen in der pull Ausdruck, mit so etwas wie folgt aus:

[* {:content/type [:db/ident] :content/locales [:db/ident] :content/groups [*]}] 

Und das ist nicht einmal wirklich das Ende, weil :content/groups selbst ref Typen innerhalb davon hat . Hat sich das Verhalten von Platzhaltern irgendwann geändert und die Dokumente sind nicht aktuell? Oder mache ich etwas falsch? Gibt es einen besseren (prägnanteren) Weg zu sagen: "rekursiv alles reinziehen"?

Antwort

2

Der Platzhalter in einem Pull-Ausdruck füllt nur die Komponentenattribute. Das heißt, Attribute mit :db/isComponent true im Schema.

am mbrainz schema Sehen, nur :release/media und :medium/tracks sind Komponentenattribute, so würden sie die einzigen, die mit einem [*] Pull Muster bevölkert sein.

Wenn Ihr Datenmodell hierarchal Referenzketten (d :person/friend als Hinweis auf eine Person, die auch Freunde verwiesen haben kann) enthält, können Sie recursive pull patterns definieren und deren rekursive Tiefe angeben (oder ... für unbegrenzt verwenden).

Dieses Thema wird auch auf der Datomic Google Group diskutiert und enthält eine Verknüpfung zu einem Beispiel rekursive Pull-Muster.

+0

ok, gibt es einen Grund, warum ich wählen könnte, ': db/isComponent true' nicht zu verwenden, wenn meine Absicht ist, die ganze Sache jedes Mal hereingezogen zu bekommen? – Kevin

+0

Also von hier lesen: http://blog.datomic.com/2013/06/component-entities.html es scheint, als ob Komponenten auf Unterobjekte aufpassen, die nicht ohne die Eltern selbst existieren. Macht es Sinn, einen Enum-Wert zu haben, der ': isComponent true' hat? – Kevin

+0

von dem, was ich sagen kann, haben alle Enums die gleiche ': db/id', wenn also ein Datensatz zurückgezogen wurde, würde': db/id' auch zurückgezogen werden. Es scheint also wünschenswert zu sein, enum-Werte zu haben: ': db/isComponent true', weil ich nicht jede einzelne enum auf einem Pull-Ausdruck manuell angeben möchte, aber auf der anderen Seite sind sie definitionsgemäß über Entitäten verteilt und also nicht geeignet für ': db/isComponent'. Ist das korrekt? – Kevin