2017-05-31 105 views
0

是否可以將通配符_傳遞給參數化查詢?類似這樣的:是否可以將數據通配符「_」傳遞給參數化查詢?

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

當我按照上面所寫的方法嘗試這個時,它拋出一個錯誤。有沒有辦法做到這一點?

我知道我可以得到一切與查詢,看起來像這樣:

(d/Q [:查找電子 :其中,[E:?類型]] DB)

但我目標是避免在我不想過濾:type的結果時需要構建單獨的查詢。用例是,例如,API端點可能會或可能不會過濾結果。

+0

你可以添加一個你想要做的例子嗎? –

回答

1

如果我理解正確的話,你應該能夠鍵入:

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

在Datomic,任何未指定的值被認爲是通配符。上述查詢將返回具有:type屬性的所有實體的列表,而不管其值如何。

更新

Datomic的查詢被設計成接受一個普通值像5:awesome被代入變量?type。像_(或引用版本'_)的符號不符合Datomic預期的模式。

只是爲了好玩,我嘗試了幾種變化,並且無法讓Datomic以您提議的方式接受符號'_'爲?type變量。我想你必須爲通配案例編寫一個單獨的查詢。

基本上,通配符_是Datomic查詢語法中的一個特殊符號(又名「保留字」),就像$一樣。 Datomic還強制查詢變量以?開頭,如?e?type。這些要求是Datomic DSL的一部分,您無法更改。

除了手工編寫單獨的查詢之外,唯一的解決方法是動態組合來自基礎部分和附加部件的查詢向量。是否比手寫不同查詢更容易或更困難取決於您的具體情況。

+0

我應該提供更多的上下文。這適用於api端點,可以在應用或不應用過濾器的情況下獲取結果。我試圖避免的是,當沒有按照特定的':type'過濾器時,需要構造一個不同的查詢結構,因爲構建單獨的查詢會產生一團糟的代碼,而能夠提供通配符會更加簡潔。 – fraxture

相關問題