Как я могу узнать, содержит ли атрибут "много мощности" в Datascript элемент?
У меня есть база данных 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
как один из его детей? (У каждого блока всегда есть только один родитель)
1 ответ
Эта проблема может быть связана с используемыми вами данными. Это рабочий пример того, что вам нужно:
(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]}
Хотя ваши идентификаторы блоков, скорее всего, уже являются уникальными идентификаторами, которые вы хотите использовать для своих объектов, здесь используются разные идентификаторы объектов, чтобы было понятно, как данные могут быть объединены.
Этот запрос устанавливает:
- мы хотим, чтобы дочерний объект с заданным идентификатором блока (2 через параметры)
- нам нужна родительская сущность, которая ссылается на дочернюю сущность
- нам нужен идентификатор блока родительской сущности