Как вытащить все сущности, связанные с другой сущностью в Datomic? - PullRequest
0 голосов
/ 31 января 2019

Я не знаю, как сформулировать мой вопрос.

: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 Ответ

0 голосов
/ 09 февраля 2019

Предполагая, что у вас есть эти сущности в 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}])


...