慢数据脚本查询

时间:2016-08-09 13:51:23

标签: clojure datascript

我正在使用Datascript查询树的最后一个共同祖先的结构 2个节点给出了名字,here's到目前为止我已经得到了什么,但它确实很慢 - 任何想法为什么(或者有更好的方法)?

(defn lca
  "Last common ancestor"
  [db name1 name2]
  (d/q '[
          :find [(pull ?anc [:db/id :name]) ...]
          :in    $ % ?name1 ?name2
          :where
            (?node1 :name ?name1)
            (?node2 :name ?name2)
            (anc ?anc1 ?node1)
            (anc ?anc2 ?node2)
            [(not= ?anc1 ?anc2)]
            (parent ?anc ?anc1)
            (parent ?anc ?anc2)
          ]
          @db
          '[
            [ (parent ?par ?child)
              (?par :children ?child)]
            [ (anc ?par ?child)
              (?par :children ?child)]
            [ (anc ?anc ?child)
              (?par :children ?child)
              (anc ?anc ?par)]
            ]
          name1
          name2))

我最初打算使用not来排除所有更高级的祖先 最后一个常见的,但Datascript目前不支持not,因此这两个 父母条款。

架构是:

:children {:db/valueType :db.type/ref 
           :db/cardinality :db.cardinality/many 
           :db/index true}
:name {:db/index true}

0 个答案:

没有答案