如何在XTDB的Pull API中实现无界递归Pull查询?
问题成因
- XTDB 独立的
xt/pullAPI 原生未实现对EQL无界递归标识...的语义解析,该语法仅在xt/q查询内部嵌套的pull表达式中被查询引擎做了特殊适配 - 你遇到的报错本质是独立pull接口无法识别
...作为递归配置的合法值,仅支持显式指定递归深度的数字值
解决方案
方案1:显式指定递归深度(适配独立Pull API)
你可以根据业务数据的最大递归层级,把...替换为对应数字,独立Pull API支持数字格式的递归深度配置。比如你的示例中递归层级最多为8层,写成如下形式即可正常调用:
;; 最多递归10层,足够覆盖绝大多数场景 (xt/pull (xt/db node) [* {:composite/contains 10}] 6)
方案2:封装Query API实现无界递归的Pull调用
如果你需要保持无界递归的写法,不需要手动指定深度,可以封装一个工具函数复用Query API的pull能力,性能损耗可以忽略:
(defn pull-unbounded [db pull-pattern eid] (ffirst (xt/q db '{:find [(pull ?eid pattern)] :in [?eid pattern]} eid pull-pattern))) ;; 调用方式和原生pull完全一致,支持无界递归 (pull-unbounded (xt/db node) [* {:composite/contains ...}] 6)
内容的提问来源于stack exchange,提问作者Aram Zadikian
相关产品推荐
相关产品推荐

