尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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),仅供参考
RELATED

相关推荐

单片机毕设选题推荐:基于 STM32 或 51 单片机自动 / 手动双模式智能感应门控制器设计 基于 STM32 或 51 单片机声光提醒智能自动门软硬件系统实现(012404)

单片机毕设选题推荐:基于 STM32 或 51 单片机自动 / 手动双模式智能感应门控制器设计 基于 STM32 或 51 单片机声光提醒智能自动门软硬件系统实现(012404)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

📅 2026/10/8 7:37:32
jellyfin-plugin-douban新手配置指南:请求间隔等5个关键设置一次讲透

jellyfin-plugin-douban新手配置指南:请求间隔等5个关键设置一次讲透

jellyfin-plugin-douban新手配置指南:请求间隔等5个关键设置一次讲透 【免费下载链接】jellyfin-plugin-douban Douban metadata provider for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-douban 如果你是 Jellyfin 用户&#x…

📅 2026/10/3 13:51:30
页面交互变慢时先核对样式层级

页面交互变慢时先核对样式层级

页面交互变慢时先核对样式层级 交互卡顿可能来自 JavaScript、样式计算、布局、绘制、合成或网络等待。Chrome Performance 录制能帮助判断哪一段占用了帧时间;没有 JavaScript 异常并不表示问题只在 CSS。 本文从强制同步布局和样式规则两个常见方向出发&#xf…

📅 2026/10/13 22:59:59
MORE NEWS

更多资讯

📰

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

📰

综合之自动售货机2.0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

AHT10读取温湿度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

ws2812动态滚动显示图片

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

MIPI协议介绍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

【后端】ORM / ODM

待更新

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬