数据逻辑分离

时间:2014-12-11 06:50:57

标签: datomic datalog

对不起,如果这很明显,但我如何在Datomic中表示逻辑分离?例如,如果我正在寻找名称为" 1"或者年龄小于5岁,我该怎么办呢?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

要快速了解新功能,请查看他们宣布的blog post

答案 1 :(得分:0)

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

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

在这种情况下,规则定义了两条逻辑路径来满足定义&#34;社交媒体。&#34;因此,社区/类型的推特或社区/类型的facebook-page符合&#34;社交媒体的标准。&#34;这个例子在&#34;查询规则&#34;结束时更详细地充实了。 tutorial

的部分
(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:seregion:s中的包含,以及social media的多个路径。< / p>