Ich benutze Datascript um eine Baumstruktur für den letzten gemeinsamen Vorfahren von 2 Knoten mit gegebenen Namen, here's, was ich bisher habe, aber es ist wirklich langsam - jede Idee warum (oder Gibt es einen besseren Weg)?Slow Datascript Abfrage
(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))
ich zunächst alle höheren Vorfahren als der letzt gemeinsam man ausschließen würde not
verwenden, aber Datascript zurzeit nicht not
daher die beiden Elternklauseln nicht unterstützt.
Das Schema ist:
:children {:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db/index true}
:name {:db/index true}