Как вытащить все сущности, связанные с другой сущностью в Datomic?
Я не знаю, как сформулировать мой вопрос.
:host/id
имеет ссылку на :server/id
, Я хочу вытащить все серверы, связанные с конкретным хостом.
Я пробовал несколько подходов, но я получаю либо пустой результат, все результаты или IllegalArgumentExceptionInfo :db.error/not-a-keyword Cannot interpret as a keyword
,
Я пытался следовать документации, но я все время теряюсь. Вот мои попытки до сих пор:
Все хозяева
(d/q '[:find (pull ?server [{:host/id [:host/hostname]}])
:in $ ?hostname
:where
[?host :host/hostname ?hostname]
[?server :server/name]] db "myhost")
IllegalArgumentExceptionInfo
(d/q '[:find (pull ?server [{:host/id [:host/hostname]}])
:in $ ?hostname
:where
[?server :server/name ?host]
[?host :host/hostname ?hostname]] db "myhost")
[]
(d/q '[:find (pull ?host [{:host/id [:host/hostname]}])
:in $ ?hostname
:where
[?host :host/hostname ?hostname]
[?host :server/name]] db "myhost")
1 ответ
Предполагая, что у вас есть эти сущности в datomic:
(d/transact conn [{:host/name "host1"}])
(d/transact conn [{:server/name "db1"
:server/host [:host/name "host1"]}
{:server/name "web1"
:server/host [:host/name "host1"]}])
И, предполагая, что каждый сервер имеет ссылку на хост (см. Схему ниже), для запроса, какие серверы связаны с хостом, используйте синтаксис обратной связи '_':
(d/q '[:find (pull ?h [* {:server/_host [:server/name]}])
:in $ ?hostname
:where
[?h :host/name ?hostname]]
(d/db conn)
"host1")
дам тебе:
[[{:db/id 17592186045418,
:host/name "host1",
:server/_host [#:server{:name "db1"} #:server{:name "web1"}]}]]
Вот пример схемы для вашей справки:
(def uri "datomic:free://localhost:4334/svr")
(d/delete-database uri)
(d/create-database uri)
(def conn (d/connect uri))
(d/transact conn [{:db/ident :server/name
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity
:db/valueType :db.type/string}
{:db/ident :server/host
:db/cardinality :db.cardinality/one
:db/valueType :db.type/ref}
{:db/ident :host/name
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity
:db/valueType :db.type/string}])