设置考虑以下DataScript数据库的电影和演员,数据从learndatalogtoday.org窃取:以下代码可以在JVM/Clojure REPL或ClojureScript REPL中执行,只要project.clj
包含[datascript "0.15.0"]
作为依赖项.
(ns user
(:require [datascript.core :as d]))
(def data
[["First Blood" ["Sylvester Stallone" "Brian Dennehy" "Richard Crenna"]]
["Terminator 2: Judgment Day" ["Linda Hamilton" "Arnold Schwarzenegger" "Edward Furlong" "Robert Patrick"]]
["The Terminator" ["Arnold Schwarzenegger" "Linda Hamilton" "Michael Biehn"]]
["Rambo III" ["Richard Crenna" "Sylvester Stallone" "Marc de Jonge"]]
["Predator 2" ["Gary Busey" "Danny Glover" "Ruben Blades"]]
["Lethal Weapon" ["Gary Busey" "Mel Gibson" "Danny Glover"]]
["Lethal Weapon 2" ["Mel Gibson" "Joe Pesci" "Danny …
Run Code Online (Sandbox Code Playgroud) 我正在使用 Datascript 查询具有给定名称的 2 个节点的最后一个共同祖先的树结构,这是我到目前为止所得到的,但它真的很慢 - 知道为什么(或者有更好的方法)?
(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)]
] …
Run Code Online (Sandbox Code Playgroud) 我对datomic.api/tempid
提供实体ID的fn 有一些疑问.
它产生了一些long
价值,不UUID String
和long
是64位,它让我想想的独特性后,某些时候,我可能会达到长的限制.反而会更难UUID
.
当我写这样的代码时,我会问自己"这是否达到实体ID限制并在添加新实体时导致问题?"
@(d/transact
conn
[{:db/id (d/tempid :db.part/user)
:city/district "BEYKOZ"}])
Run Code Online (Sandbox Code Playgroud)