0

如果这非常明显,我很抱歉,但是我如何在 Datomic 中表示逻辑析取?例如,如果我正在寻找一个名称为“1”或年龄小于 5 岁的实体,我将如何处理?

谢谢!

4

2 回答 2

2

从 0.9.5130 开始,您可以直接编写析取查询:

(q '[:find ?e
     :where
     (or-join [?e]
       [?e :name "1"]
       (and [?e :age ?age]
            [(< ?age 5)]))]
   db)

要快速了解新功能,请查看他们宣布该功能的博客文章。

于 2015-01-29T03:51:08.880 回答
0

您可以通过使用规则来完成此操作。文档中的一个示例显示了表达逻辑 OR 的规则形式:

[[(social-media ?c)
  [?c :community/type :community.type/twitter]]
 [(social-media ?c)
  [?c :community/type :community.type/facebook-page]]]

在这种情况下,该规则定义了两条逻辑路径以满足“社交媒体”的定义。因此,社区/类型 twitter 或社区/类型 facebook 页面都符合“社交媒体”的标准。在本教程的“使用规则查询”部分结束时,此示例更加详细。

(let [rules '[[[region ?c ?r]
               [?c :community/neighborhood ?n]
               [?n :neighborhood/district ?d]
               [?d :district/region ?re]
               [?re :db/ident ?r]]
              [[social-media ?c]
               [?c :community/type :community.type/twitter]]
              [[social-media ?c]
               [?c :community/type :community.type/facebook-page]]
              [[northern ?c]
               (region ?c :region/ne)]
              [[northern ?c]
               (region ?c :region/n)]
              [[northern ?c]
               (region ?c :region/nw)]
              [[southern ?c]
               (region ?c :region/sw)]
              [[southern ?c]
               (region ?c :region/s)]
              [[southern ?c]
               (region ?c :region/se)]]]
  (pprint (q '[:find [?n ...]
               :in $ %
               :where
               [?c :community/name ?n]
               (southern ?c)
               (social-media ?c)]
             (db conn)
             rules)))

此示例结合了包含在southern- :region/swregion:se和中的多个逻辑路径,region:s以及包含到 中的多个路径social media

于 2014-12-16T19:20:16.740 回答