图谱 CLI 命令
backlog graph 命令组让你在终端里直接对项目的任务/知识图谱跑只读 Cypher 查询,也可以创建自己的命名数据库、写入数据、从 CSV 导入。它是 Web 界面 Cypher 搜索(backlog browser 里的放大镜对话框)的命令行对应物,适合临时分析、脚本化处理与管道输出。完整的官方指南随时可以查看:
backlog instructions graph
查询是严格只读的:写关键字(
CREATE/DROP/DELETE/INSERT/MERGE/SET/UPDATE)会被拒绝,图谱与 Markdown 语料都不会被修改。请在项目根目录(或其子目录)下运行,CLI 才能定位backlog/。
后端与性能
- 后端现状:默认后端是 RyuGraph WASM(Kuzu 的 MIT fork 的 WebAssembly 构建),在 Bun 的 WebAssembly 运行时内执行,各平台开箱即用,无需任何环境变量。原生 Kuzu 依赖已移除,
BACKLOG_GRAPH_BACKEND=kuzu不再是合法取值。BACKLOG_GRAPH_BACKEND=memory可强制纯 JS 内存降级模式(不支持 Cypher);ryu 初始化失败时也会自动回退到内存后端而不会崩溃,并打印一行英文告警说明失败路径与原因(database path not visible to the WASM filesystem表示 MEMFS 看不到该路径,engine error表示引擎自身故障——后者才需要上报)。数据库本体在 WASM 的内存文件系统里,缓存目录只存锁与指纹边车,这是正常现象。 - 快照复用:对
default图谱的命令首次运行需要完整构建(本仓库约 6–11 秒);CLI 会把构建结果作为 JSON 快照写入操作系统缓存目录,之后只要语料指纹、解析器版本与图结构版本都未变,就直接从快照恢复(约快一倍),语料一变则自动重建并刷新快照。快照只是缓存,删除它最多损失一次重建。 - 每次调用独立:CLI 每次运行都在内存中打开数据库、退出时关闭,与 Web 界面各自持有的图谱互不争抢(各自使用独立的槽位与锁)。
数据库概念
每个子命令都作用于一个数据库名:
default:由 Markdown 语料派生的图谱(任务、草稿、里程碑、Wiki、文档、决策)。它是只读缓存,任何写操作都会被拒绝并提示改用graph create。- 用户数据库:用
backlog graph create创建,数据以 JSON 快照形式持久化在<backlog>/databases/下(随项目一起可被版本管理),跨进程可读可写。
backlog graph list # 列出 default 与所有用户数据库(含大小)
backlog graph create people "people and their relationships" # 创建用户数据库
backlog graph describe people # 查看单个数据库的描述、时间与各表行数
backlog graph drop people # 删除数据库及其快照(default 不可删)
查看 schema
backlog graph schema default # 打印节点表(含属性与主键)与关系表(含两端点)
backlog graph schema default --json # 机器可读 JSON
schema 有别名 show-schema。default 图谱的节点表是 FileNode(每个 Markdown 文件一个节点,属性含 path / id(大写任务 ID)/ type / title / status / updatedDate)、Tag、Meta(内部记账,查询无意义);关系表有 ParentOf(父→子)、BelongsToMilestone(任务→里程碑)、DependsOn(依赖方→被依赖方)、SourcedFrom、LinksTo、TaggedWith。注意节点标签是 FileNode 而不是 File。
运行 Cypher 查询
backlog graph query default "MATCH (n:FileNode) RETURN count(n)"
backlog graph query default "MATCH (a:FileNode)-[:ParentOf]->(b:FileNode) RETURN a.path, b.path LIMIT 10"
backlog graph query people "MATCH (a:Person)-[:KNOWS]->(b:Person) RETURN a.name, b.name"
- 第一个位置参数是数据库名,第二个是 Cypher 语句(请用引号包住;双引号各平台通用)。旧式单参数写法
backlog graph query "MATCH ..."仍然有效,等价于查询default。 - 默认输出对齐的纯文本表格(无 ANSI 转义,可安全管道);
--json输出原始结果对象{ columns, rows, nodeKeys, truncated },供脚本消费。 - 交互显示上限为 500 行,超限时结果带截断提示;
--all取消该上限返回全部行。 - 任务 ID 以大写存储。沿关系查询时注意方向:
ParentOf是父→子,DependsOn是依赖方→被依赖方。
写入用户数据库(insert)
backlog graph insert people "CREATE NODE TABLE Person(name STRING PRIMARY KEY, age INT64)"
backlog graph insert people "CREATE REL TABLE KNOWS(FROM Person TO Person)"
backlog graph insert people "CREATE (:Person {name: 'Alice', age: 30})"
insert 接受写 Cypher(CREATE / MERGE / SET / DELETE),每条语句执行成功后重写一次快照——持久但不是跨语句事务。写入受每数据库单持有者锁与快照指纹保护;--force 跳过指纹校验。default 拒绝 insert。快照是整库序列化/回放,数据量大约 1e5 行以内体验良好。
导入 CSV
# 作为节点导入:表名默认取文件名,可用 --node 指定,--map 改写列名
backlog graph import people data/people.csv --node Person --map "First Name=firstName"
# 无表头文件:列名自动生成为 column1、column2…
backlog graph import people data/raw.csv --no-header --node Raw
# 作为边导入:两列是两端点的主键,端点必须已存在(只匹配、不创建)
backlog graph import people data/knows.csv --rel KNOWS --from person --to friend --node Person
- 第一列是主键;重复导入同一文件按主键更新已有行(upsert),不会产生重复边。
- 表不存在时自动创建并按列推断类型(
INT64→DOUBLE→BOOLEAN,兜底STRING);空单元格成为 NULL。 - 格式错误的文件(列数不齐、引号未闭合、非法列名等)会在打开数据库之前报出行号,数据库保持原样。
- 边导入中找不到端点的行会被跳过并报告跳过行数;
--from-node/--to-node仅在关系表尚不存在时需要。