2017-05-31 1 views
0

Ist es möglich, einen Platzhalter _ in eine parametrisierte Abfrage übergeben? Etwas wie dieses:Ist es möglich, das Datalog-Platzhalterzeichen _ in eine parametrisierte Abfrage zu übergeben?

Wenn ich dieses wie oben geschrieben versuchte, warf es einen Fehler. Gibt es eine Möglichkeit, dies zu tun?

Ich weiß, dass ich alles mit einer Abfrage erhalten können, die wie folgt aussieht:

(d/q [: Finden Sie e : wo [e: Typ]] db)

Aber mein Ziel ist es, separate Abfragen zu vermeiden, wenn ich die Ergebnisse nicht nach :type filtern möchte. Der Anwendungsfall ist z. B. ein API-Endpunkt, der Ergebnisse filtern kann oder nicht.

+0

Können Sie ein Beispiel hinzufügen, was Sie zu tun versuchen? –

Antwort

1

Wenn ich Sie richtig verstanden habe, sollten Sie in der Lage zu geben:

(d/q [:find ?e 
     :in $ 
     :where [?e :type]] db) 

In Datomic, werden alle nicht spezifizierten Werte gelten als Platzhalter sein. Die obige Abfrage gibt eine Liste aller Entitäten mit dem Attribut :type zurück, unabhängig vom Wert.

aktualisieren

Datomic Abfrage ist für einen ebenen Wert zu übernehmen, wie 5 oder :awesome in die ?type variable wechselt werden müsse. Ein Symbol wie _ (oder die zitierte Version '_) passt nicht zu dem von Datomic erwarteten Muster.

Nur zum Spaß habe ich verschiedene Varianten ausprobiert und konnte Datomic nicht dazu bringen, das Symbol '_ für die Variable ?type in der von Ihnen vorgeschlagenen Weise zu akzeptieren. Ich denke, Sie müssen eine separate Abfrage für den Wildcard-Fall schreiben.

Im Wesentlichen ist der Platzhalter _ ein spezielles Symbol (auch bekannt als "reserviertes Wort") in der Datomic-Abfragesyntax wie $. Datomic erzwingt auch, dass Abfragevariablen mit einem ? wie ?e oder ?type beginnen. Diese Anforderungen sind Teil des Datomic DSL, das Sie nicht ändern können.

Die einzige Problemumgehung neben dem manuellen Schreiben separater Abfragen wäre das dynamische Erstellen des Abfragevektors aus einem Basisteil und Add-On-Teilen. Ob das einfacher oder schwerer ist als das manuelle Schreiben der verschiedenen Abfragen, hängt von Ihrer spezifischen Situation ab.

+0

Ich hätte mehr Kontext zur Verfügung gestellt. Dies gilt für einen API-Endpunkt, der Ergebnisse mit oder ohne angewendeten Filter abruft. Was ich zu vermeiden versuche, muss eine andere Abfragestruktur konstruieren, wenn es keinen Filter nach einem bestimmten ': type' gibt, da das Erstellen separater Abfragen eine Menge Code erzeugt, während die Bereitstellung eines Platzhalters prägnanter wäre. – fraxture

Verwandte Themen