【问题标题】:How can I find whether a many cardinality attribute in Datascript contains an element?如何查找 Datascript 中的多基数属性是否包含元素?
【发布时间】:2020-06-04 21:49:27
【问题描述】:

我有一个像这样的 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? (每个区块只有一个父区块)

【问题讨论】:

标签: clojure clojurescript datomic datalog datascript


【解决方案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]}

虽然您的块 ID 很可能已经是您想要的唯一 ID 用于您的实体,这将使用不同的实体 ID 来制作它 清楚,如何组合数据。

这个查询建立:

  • 我们想要具有给定块 id 的子实体(2 通过参数)
  • 我们想要引用子实体的父实体
  • 我们想要父实体的块 id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多