介绍 Asami:一个灵活的、多平台的 Clojure 图形存储

在数据管理的领域中,图数据库提供了一种强大的方式来表示复杂的关系。对于 Clojure 生态系统的开发者,Asami 作为一个灵活的、多平台图形存储出现,旨在弥合无模式数据输入的便利性与结构化图分析的强大功能之间的差距。

Asami 用 Clojure 编写,旨在在 Java 虚拟机 (JVM) 和 JavaScript 平台(包括浏览器和 Node.js)上保持完全相同的运行方式,使其成为全栈 Clojure 开发的多功能选择。

核心理念与目标

Asami 围绕几个关键的架构目标构建,优先考虑灵活性和稳定性:

  • 无模式数据:数据可以在不了解其结构的情况下加载,允许快速演进并更容易摄取异构数据。
  • 通过不可变性实现的稳定性:存储系统使用不可变结构,以确保写操作不会导致数据损坏。
  • 可插拔存储:类似于 Datomic,Asami 支持多个存储后端。目前提供两种内存系统和针对 JVM 的持久存储。
  • 开放世界假设:借鉴 RDF 的语义,Asami 采用开放世界假设。这意味着数据库不会假设信息缺失即为错误,这与其无模式特性相辅相成。

关键特性

超越其核心理念,Asami 提供了一套针对图密集工作负载的特性:

查询与执行

Asami 提供的查询 API 故意类似于简化版的 Datomic。为优化性能,它包含一个 查询规划器,用于分析查询并找到最有效的执行计划,必要时也可以禁用以进行手动控制。

图分析

Asami 提供内部机制以实现高效的图遍历。关键功能包括:

  • 传递闭包:能够在多个跳数之间找到所有相连的节点。
  • 子图识别:工具用于从更大的数据集中识别并提取特定子图。
  • 传递查询:支持在查询中使用 +* 符号表示传递属性(例如,查找“朋友的朋友”。)

生态系统集成

Asami 通过 asami-loom 包与 Loom(一个图分析库)集成。这使开发者能够进行高级分析,甚至生成图的可视化表示(例如,导出为 PDF)。

开始使用 Asami

安装

可以通过 deps.edn 或 Leiningen 将 Asami 添加到项目中:

deps.edn

{:deps {org.clojars.quoll/asami {:mvn/version "2.3.4"}}}

project.clj

[org.clojars.quoll/asami "2.3.4"]

基本用法

创建和交互数据库非常直接。您可以使用简单的 API 初始化内存数据库并进行事务操作:

(require '[asami.core :as d])

;; Create and connect
(def db-uri "asami:mem://dbname")
(d/create-database db-uri)
(def conn (d/connect db-uri))

;; Transact data
(def movies [{:movie/title "Explorers" :movie/release-year 1985}])
@(d/transact conn {:tx-data movies})

;; Query data
(def db (d/db conn))
(d/q '[:find ?title :where [?m :movie/title ?title]] db)

处理更新

由于 Asami 遵循开放世界假设,属性默认是多值的。要替换已有属性值(类似于“闭世界”更新),开发者可以在属性名称后加上引号字符进行标注(例如,:movie/genre')。

高级存储与工具

本地存储

对于超出内存容量的数据集,Asami 支持本地磁盘存储(asami:local://dbname)。本地数据库使用 InternalNode 对象而非关键字作为实体 ID,以优化内存使用,这对于可能达到数 GB 大小的数据库至关重要。

命令行界面 (CLI)

Asami 提供了一个 CLI 工具(可通过 GraalVM 构建),允许用户从 EDN 或 JSON 文件加载数据并直接在终端执行查询。这对于快速数据探索或在不编写完整 Clojure 应用的情况下管理本地存储非常有用。

摘要表:Asami 一览

特性 实现
平台 JVM, JavaScript (Node.js, Browser)
模式 无模式(路线图上计划可选模式)
存储 内存, 本地磁盘 (JVM)
查询风格 类似 Datomic
分析 子图、传递闭包、Loom 集成

Sources