对不起,如果这很明显,但我如何在Datomic中表示逻辑分离?例如,如果我正在寻找名称为" 1"或者年龄小于5岁,我该怎么办呢?
谢谢!
答案 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/sw
,region:se
和region:s
中的包含,以及social media
的多个路径。< / p>