介紹 Asami:一個靈活的多平台圖形儲存庫,適用於 Clojure

Introducing Asami: A Flexible, Multiplatform Graph Store for Clojure

介紹 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

安裝

Asami 可透過 deps.edn 或 Leiningen 將其加入專案:

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)
模式 Schemaless (Optional schemas on roadmap)
儲存 In-memory, Local Disk (JVM)
查詢風格 Datomic-like
分析 Subgraphs, Transitive Closures, Loom Integration

SUMMARY: Asami 是一個適用於 Clojure 與 ClojureScript 的無模式圖形資料庫,支援可插拔儲存、圖形分析,以及開放世界假設模型。

Sources