带通配符的数据查询部分字符串

问题描述 投票:0回答:3

所以,我不是数据库人员或开发人员,我是网络和系统管理员。我们有一个人离开了,我正在努力做到这一点。我觉得它应该像在 SQL 中一样非常简单,所以我一定遗漏了一些东西。

我正在从数据控制台运行查询,我只想返回具有相似值的实体。我的大脑将这等同于在文档等中搜索时使用通配符。

有效的示例查询:

[:找到?e :在哪里 [?e :project/name "3000gtVR4"] ]

所以当项目名称已知时,这非常有效......我得到了我期望的实体 ID 值。但是,如果我想查看数据库中是否有类似的项目名称,但我不知道它到底是什么... 3000gt* 或 *VR4 或类似的东西可以在许多程序中使用,但我找不到在 Datomic

中有效的相似值

[:找到?e :在哪里 [?e :project/name "3000gt*"] ]

NoGo...我已经尝试了大约一百种变体,老实说,我正在阅读的很多 Datomic 的东西都超出了我的经验。我觉得这不应该需要一些大量的查询和定义变量等......

您也可以使用 Clojure 语法进行回复,我可能能够充分理解它以通过 REPL 会话将其粉碎提交,但请理解我已经超出了我的领域。

wildcard datomic
3个回答
1
投票

Datomic query是Datalog的扩展形式,与传统SQL有不同的概念

尝试:

[:找到 [?e ...] :where [?e :project/name ?name] [(重新匹配#"3000gt.+" ?name)]]

[?e ...] 返回实体集合。

[(re-matches #"3000gt.+" ?name)] 使用 clojure 函数作为谓词。 这是一个很好的教程https://docs.datomic.com/on-prem/query.html


1
投票

我只是有同样的需求,这里唯一的回复对我来说不起作用,说明

#
是无效输入所以我这样做了:

{:find  [?e ...]
 :where [[(re-pattern "3000gt.+") ?regex]
         [(re-matches ?regex ?name)]
         [?e : project/name ?name]]}

您需要单独调用函数,因为函数表达式子句不嵌套.


0
投票

我发现这里给出的两个例子都很难使用,因为它们不完整。我花了十多分钟才弄清楚其他答案是在什么上下文中执行他们的代码片段以及如何为我的上下文修改他们的代码片段。这是在完整上下文中在 Clojure REPL 中执行的更完整的示例,以便读者知道 fn 正在处理查询。

(require '[datomic.client.api :as d])
(d/q '[:find ?name :in $ :where [?e :molecule/name ?name] [(re-matches #"jz_.*" ?name)]] (db/get-db))

(db/get-db)
fn 是我定义的一个获取 Datomic 数据库值的函数。

以上是直接从我的 REPL 复制而来的。它返回:

[["jz_b"] ["jz_c"] ["jz_a"] ["jz_auto_b_141"] ["jz_auto_a_107"] ["jz_d"] ["jz_a:jz_b:jz_c:jz_d:jz_e"] ["jz_e"] ["jz_auto_b_3"] ["jz_auto_a_35"] ["jz_integral"] ["jz_auto_a_121"] ["jz_auto_a_3"] ["jz_auto_a_310"] ["jz_auto_a_442"] ["jz_auto_b_107"] ["jz_auto_a_141"] ["jz_auto_a_89"] ["jz_auto_b_35"] ["jz_auto_b_89"] ["jz_auto_b_310"] ["jz_auto_b_442"] ["jz_auto_b_121"]]
© www.soinside.com 2019 - 2024. All rights reserved.