Datomic中的SQL"limit"子句的等价物

Joh*_*hnJ 10 clojure datomic

标题类型说明了一切,但是说我有一个简单的查询如下:

(q '[:find ?c ?n :where [?c :my-thing/its-attribute ?n]]
   (d/db conn))
Run Code Online (Sandbox Code Playgroud)

反对像这样的架构

[{:db/id (d/tempid :db.part/db)
  :db/ident :my-thing/its-attribute
  :db/valueType :db.type/string
  :db/doc "My thing's attribute"
  :db/cardinality :db.cardinality/one
  :db.install/_attribute :db.part/db}]
Run Code Online (Sandbox Code Playgroud)

如果查询匹配所有内容(例如,100M条目),则返回的结果将很大.如果我只想要其中一些,那么最好的方法是什么?

Tra*_*ers 5

两个随机名称使用rand(重复容忍)和样本(仅限不同)

(d/q '[:find [(rand 2 ?name) (sample 2 ?name)]
       :where [_ :artist/name ?name]]
     db)
Run Code Online (Sandbox Code Playgroud)

这个例子来自datomic的 github repo.

  • 这确实是最简单和最地道的答案,应该被接受。 (2认同)

run*_*xec 1

你尝试过使用get-some吗?

来自: http: //docs.datomic.com/query.html

来一些

get-some 函数采用数据库、实体和一个或多个基数一属性,返回实体 ID 和实体拥有的第一个属性的值的元组。

[(get-some $ ?person :person/customer-id :person/email) ?identifier]
Run Code Online (Sandbox Code Playgroud)

-- 编辑以回复评论 --

您还可以尝试进行查询以选择低于特定数量的实体。

user> (defn example-take-query [n]
        (into '[:find ?e :where [?e :age ?a]]
              [[`(~'> ~n ~'?e)]]))
#'user/example-take-query
user> (example-take-query 3)
[:find ?e :where [?e :age ?a] [(> 3 ?e)]]
user> (example-take-query 10)
[:find ?e :where [?e :age ?a] [(> 10 ?e)]]
Run Code Online (Sandbox Code Playgroud)