如果我有一个模式(伪代码)
{: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]作为输入,但我仍然得到相同的错误。看来我的语法是正确的,因为我确实尝试了另一个属性(不是参考),它工作正常。我只是坚持参考。这样做必须有最好的做法吗?
答案 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]]