如何拉在Datomic另一实体链接的所有实体?

问题描述 投票:2回答:1

我不知道怎样来写我的问题。

: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")

抛出:IllegalArgumentException信息

(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")
datomic
1个回答
3
投票

假设你有这些实体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}])


© www.soinside.com 2019 - 2024. All rights reserved.