5分钟上手Asami:在REPL中创建你的第一个图数据库(完整示例代码) 5分钟上手Asami在REPL中创建你的第一个图数据库完整示例代码【免费下载链接】asamiA graph store for Clojure and ClojureScript项目地址: https://gitcode.com/gh_mirrors/asa/asami想不想在5分钟内用纯 Clojure 代码在 REPL 里创建并查询一个真正的图数据库Clojure 图数据库 Asami是一个为 Clojure 和 ClojureScript 打造的开源图数据库无需安装任何服务端程序一条命令即可完成建库、写入和查询。本文提供一份可直接复制粘贴的 Asami 完整示例代码带你从零开始跑通第一个图数据库。为什么选择 Asami 图数据库在动手之前先花30秒了解 Asami 的核心优势。与 Neo4j 等重型图数据库不同Asami 走的是轻量、纯函数式、零配置路线无模式Schemaless无需预先定义 schema数据随插随用非常适合快速原型不可变存储所有写入基于不可变结构杜绝数据损坏风险跨平台同一套 API 同时运行在 JVMClojure和 JavaScriptClojureScript环境内置图分析支持传递闭包等快速图遍历操作可插拔存储内存图、多图、本地磁盘存储随意切换这些特性在 README.md 中有详细说明核心 API 全部集中在 src/asami/core.cljc 中。快速安装配置步骤Asami 以 Maven 依赖的形式发布配置过程只需要一步。无论你使用deps.edn还是 Leiningen都只需添加一行依赖版本以 2.2.4 为例使用 deps.edn推荐在:deps中加入{:deps {org.clojars.quoll/asami {:mvn/version 2.2.4}}}使用 Leiningen在project.clj的:dependencies中加入[org.clojars.quoll/asami 2.2.4]然后启动 REPLclj # 或 clojure至此一个完整的 Clojure 图数据库环境就绪了。想要了解项目完整的开发依赖可以参考 deps.edn 和 project.clj。在 REPL 中创建第一个图数据库完整示例代码下面这段代码就是 Asami 官方推荐的入门示例可以直接复制粘贴到 REPL 中逐行执行。我们以电影库为主题演示建库、连接、写入、查询的全流程。第1步导入命名空间并创建数据库(require [asami.core :as d]) ;; 创建内存数据库URI 格式为 asami:mem://数据库名 (def db-uri asami:mem://dbname) (d/create-database db-uri)create-database在 src/asami/core.cljc 中定义如果数据库不存在则创建并返回true。内存数据库无需任何服务进程这就是 Asami 单条语句完成建库 的魔力。第2步建立连接(def conn (d/connect db-uri))connect返回一个连接对象后续所有事务都通过它发起。第3步写入数据transact 事务Asami 支持两种写入方式直接传入实体 Map或使用[:db/add 实体 属性 值]形式的断言语句。这里我们用最直观的 Map 方式一次性写入4部电影(def first-movies [{:movie/title Explorers :movie/genre adventure/comedy/family :movie/release-year 1985} {:movie/title Demolition Man :movie/genre action/sci-fi/thriller :movie/release-year 1993} {:movie/title Johnny Mnemonic :movie/genre cyber-punk/action :movie/release-year 1995} {:movie/title Toy Story :movie/genre animation/adventure :movie/release-year 1995}]) (d/transact conn {:tx-data first-movies})注意transact返回的是一个可deref即用解引用的对象解引用后可以得到事务前后的数据库状态。在 JVM 上事务是异步执行的所以务必用等待事务完成否则立刻查询可能拿不到最新数据——这是新手最容易踩的坑。第4步查询图数据库取回当前数据库快照然后执行 Datomic 风格的 Datalog 查询(def db (d/db conn)) ;; 查询所有电影标题 (d/q [:find ?movie-title :where [?m :movie/title ?movie-title]] db)返回结果([Explorers] [Demolition Man] [Johnny Mnemonic] [Toy Story])再来一个带条件的进阶查询找出1990年之后上映的电影标题、年份和类型(d/q [:find ?title ?year ?genre :where [?m :movie/title ?title] [?m :movie/release-year ?year] [?m :movie/genre ?genre] [( ?year 1990)]] db)查询引擎的入口q在 src/asami/core.cljc它内置查询规划器会自动为查询生成高效的执行计划。第5步把节点还原成实体对象查询返回的?m是内部节点 ID可以用entity函数还原成完整的实体 Map方便直接操作;; 找出 1995 年上映的电影节点 (d/q [:find [?m ...] :where [?m :movie/release-year 1995]] db) ;; (:tg/node-10327 :tg/node-10326) ;; 查看单个实体 (d/entity db :tg/node-10327) ;; #:movie{:title Toy Story, ;; :genre animation/adventure, ;; :release-year 1995}entity的定义同样在 src/asami/core.cljc。从内存到磁盘本地持久化存储内存数据库重启即失需要持久化时只需把 URI 从mem换成local其他代码一行都不用改;; 本地磁盘数据库数据保存在 ./dbname 目录 (def local-uri asami:local://dbname) (d/create-database local-uri) (def local-conn (d/connect local-uri))本地数据库使用InternalNode作为节点 ID通过asami.graph/new-node创建并且同样支持asami:multi://前缀创建多图multi-graph结构。想深入了解存储层的实现可以阅读 src/asami/memory.cljc 和 src/asami/durable/。常见问题排查技巧查询结果为空检查transact是否已用解引用完成异步事务未完成时拿到的还是旧快照。想更新已有实体的属性Asami 遵循开放世界假设Open World Assumption属性默认可以多值。要替换单值属性可在属性名末尾加单引号例如:movie/genre。想用唯一标识定位实体为实体加上:db/ident字段即可后续事务可直接用它引用节点无需记忆内部 ID。总结通过本文的完整示例代码你已经掌握了 Asami 图数据库的核心循环创建数据库 → 连接 → 事务写入 → Datalog 查询 → 实体还原。整个过程不需要安装任何数据库服务5分钟内即可在 REPL 中跑通。如果你还想探索图分析、传递闭包等高级特性可以从 test/asami/ 下的测试用例中找到更多实战范例快打开 REPL 动手试试吧【免费下载链接】asamiA graph store for Clojure and ClojureScript项目地址: https://gitcode.com/gh_mirrors/asa/asami创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考