我有一个Datascript数据库,它是这样的:
{:block/id {:db/unique :db.unique/identity}
:block/children {:db/cardinality :db.cardinality/many}
}:block/children包含其他块的:block/id
我一直在尝试编写一个查询来查找哪个块有另一个块作为它的子块。
下面是我尝试过的一个例子:
(ds/q '[:find ?parent-ds-id
:where
[1100 :block/id ?block-id]
[?parent-ds-id :block/children ?block-id]]
@conn)我只是拿回空集作为回报。我应该如何装扮?block-id,才能得到将?block-id作为其子级的块的实体ID?(每个块只有一个父级)
发布于 2020-06-05 14:45:38
此问题可能与您正在使用的数据有关。这是您所追求的一个工作示例:
(let [schema {:block/id {:db/unique :db.unique/identity}
:block/children {:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many}}
conn (d/create-conn schema)
idify (fn [id] (* 100 id)) ; just fake some id
block (fn [id] {:db/id (idify id) :block/id id})
rel (fn [parent-id child-id] {:db/id (idify parent-id) :block/children (idify child-id)})]
(d/transact! conn [(block 1)
(block 2)
(block 3)
(rel 1 2)
(rel 1 3)])
(d/q
'[:find ?parent-id
:in $ ?child-id
:where
[?child :block/id ?child-id]
[?parent :block/children ?child]
[?parent :block/id ?parent-id]]
@conn
2))
; → #{[1]}尽管你的block- it很可能已经是你想要用于你的实体的唯一的it了,但是这里使用了不同的实体it,只是为了清楚地说明如何组合数据。
此查询将建立:
https://stackoverflow.com/questions/62204735
复制相似问题