如果这非常明显,我很抱歉,但是我如何在 Datomic 中表示逻辑析取?例如,如果我正在寻找一个名称为“1”或年龄小于 5 岁的实体,我将如何处理?
谢谢!
从 0.9.5130 开始,您可以直接编写析取查询:
(q '[:find ?e
:where
(or-join [?e]
[?e :name "1"]
(and [?e :age ?age]
[(< ?age 5)]))]
db)
要快速了解新功能,请查看他们宣布该功能的博客文章。
您可以通过使用规则来完成此操作。文档中的一个示例显示了表达逻辑 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/sw
、region:se
和中的多个逻辑路径,region:s
以及包含到 中的多个路径social media
。