我可以将向量作为参数传递给datomic查询吗?

时间:2014-12-16 05:02:58

标签: datomic

如果我有一个模式(伪代码)

{:collection/name 
 :type "string"}, 
{:photo/collection
 :type ref} 

我有一个3个系列的矢量,我希望看到所有照片。

我可以像下面这样做吗? (告诉我收集A,B或C中的所有照片

:find [?p]
:where [?p :photo/collection [17592186045568 17592186045597 17592186045654]]

当我尝试这样的事情时,我收到以下错误..

IllegalArgumentExceptionInfo :db.error/invalid-lookup-ref Invalid list form: [[17592186045568 17592186045597 17592186045654]]  datomic.error/arg (error.clj:55)

如果我不能这样做,还有其他方法可以解决这个问题吗?

更新:

我在教程中看到有一种使用...传递矢量的方法(顺便说一下,这种查询是否有名称?)我试过

{:query {:find [?p ?coll], :where [[?p :photo/collection ?coll]], :in [$ [?coll ...]]}

以[17592186045568 17592186045597 17592186045654]作为输入,但我仍然得到相同的错误。看来我的语法是正确的,因为我确实尝试了另一个属性(不是参考),它工作正常。我只是坚持参考。这样做必须有最好的做法吗?

1 个答案:

答案 0 :(得分:3)

您可以使用集合binding执行此操作。这个here有一些简单的例子。

Learn Datalog Today!中有一个集合重组部分(问题1使用此部分,如果您想尝试验证解决方案的语法是否正确)。

您的问题的类似方法可能是:

(d/q '[:find ?pid ?collection
       :in $ [?collection ...]
       :where [?p :photo/collections ?collection]
              [?p :photo/id ?pid]]
    (d/db conn)
    ["A" "B" "C"])

结果将是这样的(假设简单的整数照片ID - 我不确定你是如何实际识别照片的):

[1 "A"]
[2 "A"]
[3 "B"]

如果您只想要实体ID,您应该能够使用更简单的查询:

[:find ?p
 :in $ [?collection ...]
 :where
 [?p :photo/collection ?collection]]