graphify 的额外导出通道全解析:Wiki、Neo4j、FalkorDB、SVG、GraphML、MCP 服务器与 token 缩减基准
【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify
graphify 在构建出graphify-out/graph.json之后,真正的"知识分发"才刚刚开始。本文基于仓库中graphify/skills/copilot/references/exports.md这份导出参考文档展开,逐条讲清--wiki、--neo4j、--neo4j-push、--falkordb、--falkordb-push、--svg、--graphml、--mcp八个导出标志各自触发的步骤、完整命令与参数默认值,并结合 CLI 入口、导出实现、图数据库推送器 与 基准模块 的源码,解释每个通道的底层机制(MERGE 幂等写入、Cypher 注入防护、社区数据重建、token 估算模型),帮助你在拿到一个可查询知识图谱后,把它安全、可重复地投递到 Neo4j / FalkorDB 图数据库、Obsidian 之外的 Markdown Wiki、Gephi 等可视化工具,或让 MCP 客户端实时查询图。
导出参考文档的定位:按标志触发、互不干扰
exports.md 是/graphify技能流程中的一份条件加载参考。它的开头明确了加载时机:当用户在原始命令中传入了某个导出标志(--wiki、--neo4j、--neo4j-push、--falkordb、--falkordb-push、--svg、--graphml、--mcp)之一,或语料规模大到值得跑 token 缩减基准时,才加载该文档。每个步骤只为自己对应的标志运行,传了哪个标志就执行哪一段——这与 CLI 中export分支的subcmd分发结构完全一致:html、callflow-html、obsidian、wiki、svg、graphml、neo4j、falkordb每个子命令走各自的实现函数,不会连带执行其他导出。
整份文档覆盖了构建流程的 Step 6b 到 Step 8 五个阶段,下表是完整的"标志 → 步骤 → 命令"映射:
| 文档步骤 | 触发标志 | 命令 | 产物 / 效果 |
|---|---|---|---|
| Step 6b Wiki | --wiki | graphify export wiki | graphify-out/wiki/下的 Markdown 文章,index.md为 agent 入口 |
| Step 7 Neo4j | --neo4j | graphify export neo4j | graphify-out/cypher.txt,供cypher-shell手动导入 |
| Step 7 Neo4j push | --neo4j-push <uri> | graphify export neo4j --push bolt://localhost:7687 --user neo4j --password PASSWORD | 直接推送到运行中的 Neo4j 实例 |
| Step 7a FalkorDB | --falkordb | graphify export falkordb | 可移植的cypher.txt(OpenCypher 语句) |
| Step 7a FalkorDB push | --falkordb-push <uri> | graphify export falkordb --push falkordb://localhost:6379 | 直接推送到运行中的 FalkorDB 实例 |
| Step 7b SVG | --svg | graphify export svg | graphify-out/graph.svg,可嵌入 Markdown/Obsidian/Notion |
| Step 7c GraphML | --graphml | graphify export graphml | graphify-out/graph.graphml,供 Gephi、yEd 打开 |
| Step 7d MCP | --mcp | $(cat graphify-out/.graphify_python) -m graphify.serve graphify-out/graph.json | stdio MCP 服务器,向 agent 暴露 7 个图查询工具 |
| Step 8 基准 | total_words > 5000 | graphify benchmark | 终端打印的 token 缩减报告 |
Step 6b:Wiki 导出(仅--wiki)
文档给出的操作只有一行:
graphify export wiki但文档特别强调了两条执行约束,这里结合源码逐一印证:
- 必须在 Step 9(清理)之前运行,因为此步骤依赖
graphify-out/.graphify_labels.json中尚存的社区标签。在 CLI 的 wiki 分支 中,labels正是从该文件加载后传入to_wiki的。 - 社区数据是硬前置。CLI 在导出前会检查
.graphify_analysis.json:若缺失或其中没有任何社区,直接报错退出——"refusing to export wiki to prevent data loss",并提示先运行graphify extract .(或graphify cluster-only .)重新生成社区数据(cli.py#L2877-L2883)。若分析文件里缺少 god nodes 数据,还会调用analyze.god_nodes现场补算。
成功时输出形如:Wiki: N articles written to graphify-out/wiki/,其中wiki/index.md被明确标记为 agent 入口——也就是说 Wiki 导出物不仅给人读,也给后续接入的 AI agent 当作索引用。
Step 7:Neo4j 导出(--neo4j或--neo4j-push)
文件模式:--neo4j生成 Cypher 导入脚本
graphify export neo4j该模式调用to_cypher生成graphify-out/cypher.txt,每行一条语句,头部注释标明由/graphify生成:
- 节点语句:
MERGE (n:<FileType> {id: '...', label: '...'});,节点标签取自file_type属性(如Code、Document); - 边语句:
MATCH (a {id: '...'}), (b {id: '...'}) MERGE (a)-[:<RELATION> {confidence: '...'}]->(b);,关系类型取自边的relation属性并大写,confidence(EXTRACTED / INFERRED / AMBIGUOUS)作为关系属性一并写入。
CLI 打印的后续操作提示是:cypher.txt written - import with: cypher-shell < graphify-out/cypher.txt。
从源码看有两处值得一提的健壮性设计:
- 注入防护:
_cypher_escape转义\、'、换行(\\n/\\r),并剥离 C0 控制字符——注释中明确记录了此前\n/\r会让恶意标签"跳出语句行、在下一行注入一条新的 MATCH/DELETE"的 F-008 缺陷;_cypher_label则对标识符位置(Cypher 中不可加引号的:Label与关系类型)做白名单过滤,只保留[A-Za-z0-9_]且必须以字母开头,否则回退为Entity/RELATES_TO。 - MERGE 语义:全部语句使用
MERGE,因此重复导入不会产生重复节点或边——这与文档"Uses MERGE - safe to re-run without creating duplicates"的说法一致。
推送模式:--neo4j-push <uri>直连实例
graphify export neo4j --push bolt://localhost:7687 --user neo4j --password PASSWORD默认 URI 为bolt://localhost:7687,默认用户为neo4j(cli.py#L2663 中push_user = "neo4j"即为默认值)。若未提供凭据,参考文档要求 agent 先向用户询问。
推送由push_to_neo4j实现,要点:
- 依赖
neo4jPython 驱动(缺失时明确提示pip install neo4j); - 节点属性只保留标量值(str/int/float/bool)并剔除下划线开头的内部字段,
id作为合并键,社区 ID(community)一并写入,因此MATCH ... MERGE (a)-[r:REL]->(b) SET r += $props天然幂等; - 返回
{"nodes": N, "edges": M}计数,CLI 打印为Pushed to Neo4j: N nodes, M edges。
一个文档未展开、但源码中可确认的安全细节:CLI 在解析参数时优先读取环境变量NEO4J_PASSWORD(见 cli.py#L2664-L2671),--password显式传入才覆盖它——目的是避免密码出现在ps进程列表和 shell 历史里。推送模式下密码是必需的(否则报错--password required for --push)。
Step 7a:FalkorDB 导出(--falkordb或--falkordb-push)
文件模式:--falkordb生成可移植 Cypher
graphify export falkordb产出同样是graphify-out/cypher.txt,但文档给出了一条重要的使用边界:语句是 OpenCypher,而 FalkorDB 的GRAPH.QUERY一次只能执行一条语句——没有 Neo4jcypher-shell那样的批量脚本导入通道。因此文档建议把文件模式仅当作"想要一份可移植cypher.txt制品"时的选择,实际建图应优先用推送模式。CLI 在非推送模式下打印的提示与之一致(cli.py#L2926-L2929)。
推送模式:--falkordb-push <uri>
graphify export falkordb --push falkordb://localhost:6379参数默认值(文档与push_to_falkordb的 docstring 互相印证):
- 默认 URI:
falkordb://localhost:6379。scheme 只是信息性的——实现里用urlparse只取 host 和 port,所以redis://localhost:6379甚至裸的host:port都等价,默认端口 6379; - 认证可选:FalkorDB 默认无凭据运行,所以文档写明"仅当实例要求认证时才向用户询问"。源码中只有提供了 password 才会发送 username(避免把 Neo4j 风格的默认用户名
neo4j传给 FalkorDB 被当作未知 ACL 用户拒绝),URI 中内嵌的凭据优先于命令行参数; - 目标图名默认
graphify,通过db.select_graph(graph_name)选中,同一实例内按图名隔离多张图; - 依赖
falkordbPython SDK(缺失时提示pip install falkordb)。
写入语句与 Neo4j 通道完全相同(MERGE (n:...) SET n += $props/MATCH ... MERGE (a)-[r:REL]->(b) SET r += $props),因为 FalkorDB 兼容 OpenCypher,因此重复推送安全、不会产生重复。密码同理支持FALKORDB_PASSWORD环境变量以避开 argv。
Step 7b:SVG 导出(--svg)
graphify export svg产物为graphify-out/graph.svg。从to_svg的实现看,它的定位是轻量、可嵌入、零 JavaScript的静态图:
- 使用 matplotlib(Agg 后端)+ NetworkX 的 spring layout(
seed=42保证布局可复现),画布默认 20×14 英寸、深色背景; - 节点大小随度数缩放(
300 + 1200 * degree/max_degree),节点颜色按社区取自与 HTML 输出一致的COMMUNITY_COLORS调色板; - 边的样式编码置信度:
EXTRACTED为实线、alpha=0.6,其他置信层级为虚线、alpha=0.3——即图的每个元素都保留其证据强度; - 若存在社区标签,图左上角附图例(社区名 + 成员数)。
依赖 matplotlib,未安装时会抛出带安装指引的ImportError(pip install matplotlib)。CLI 成功提示为:graph.svg written - embeds in Obsidian, Notion, GitHub READMEs。
Step 7c:GraphML 导出(--graphml)
graphify export graphml产物为graphify-out/graph.graphml,可用 Gephi、yEd 或任何 GraphML 兼容工具打开。to_graphml中值得了解的实现细节:
- 社区 ID 以节点属性
community写入,Gephi 可据此按社区着色;边的confidence属性原样保留; - 内部标记(
_前缀的属性,如 AST 来源标签_origin、方向恢复用的_src/_tgt)在导出前被剥离——它们是实现细节而非图数据,不应泄漏到外部工具; - 由于
nx.write_graphml只接受标量属性,None被强制为""、dict/list 被序列化为 JSON 字符串,且所有字符串经过_strip_xml_illegal清理 XML 1.0 非法控制字符(注释中举了真实案例:从终端粘贴的 markdown 标题带着 ANSI 转义,曾让整次导出失败); - 写入采用"临时文件 +
os.replace"的原子写模式,避免序列化中途出错留下 0 字节的.graphml被下游工具误认为完整导出物。
Step 7d:MCP 服务器(--mcp)
$(cat graphify-out/.graphify_python) -m graphify.serve graphify-out/graph.json这一步启动一个stdio MCP 服务器,把已构建的知识图谱变成可被其他 agent 实时查询的"工具集"。serve.py 中按源码确认的七个核心工具与文档一一对应:query_graph(按问题检索子图)、get_node(查节点详情)、get_neighbors(邻居展开)、get_community(社区视角)、god_nodes(高连通度关键节点)、graph_stats(图规模统计)、shortest_path(两节点间路径)。源码中还可见list_prs、get_pr_impact、triage_prs等 PR 相关工具函数,供有 GitHub 场景的部署使用。
两个关键参数的来龙去脉:
$(cat graphify-out/.graphify_python)是什么:/graphify技能在初始化阶段解析出可用的 Python 解释器后,会将其绝对路径写入graphify-out/.graphify_python(见 skill-agents.md#L98 中的写法:open('graphify-out/.graphify_python', 'w').write(sys.executable))。后续所有步骤都用$(cat ...)替换python3,保证命令跑在正确环境里。hooks.py 也依赖同一文件做解释器探测。- 为什么 Claude Desktop 配置必须写绝对路径:Claude Desktop 不会执行 shell,
$(...)不会生效;且通过uv tool install安装时系统python3无法import graphify。因此文档给出的claude_desktop_config.json片段要求把command设为cat graphify-out/.graphify_python打印出来的绝对解释器路径,args中放-m graphify.serve与绝对路径的graph.json:
{ "mcpServers": { "graphify": { "command": "<absolute path from: cat graphify-out/.graphify_python>", "args": ["-m", "graphify.serve", "/absolute/path/to/graphify-out/graph.json"] } } }配置完成后,Claude Desktop 或任何支持 MCP 的 agent 编排器即可实时查询该项目的知识图谱。从 serve.py 的加载逻辑 看,服务器启动时会校验.json后缀与文件存在性、执行文件大小上限检查、把links/edges两种边键形态归一化,并对旧版节点 ID 方案给出重建提示——也就是说 MCP 通道复用了与 CLI 查询相同的安全边界。
Step 8:Token 缩减基准(total_words > 5000时)
若graphify-out/.graphify_detect.json中的total_words大于 5000,运行:
graphify benchmark并把输出直接打印到聊天中;total_words <= 5000时静默跳过——文档给出的理由值得记住:对小语料,图谱的价值在于结构性清晰度,而不是 token 压缩。
CLI 的 benchmark 分支 的取数路径:读取 detect 输出中的total_words作为语料规模,交给run_benchmark计算。benchmark.py 的测量模型完全可考:
- 语料侧:按"100 词 ≈ 133 token"的近似把
corpus_words折算为 token 数,代表"把整个语料塞进上下文"的朴素成本; - 查询侧:内置 5 个样板问题("how does authentication work"、"what is the main entry point" 等),对每个问题先按词项在节点 label 上打分取 top-3 起始节点,再沿边做 3 层 BFS 展开子图,按 4 字符/token 估算该子图注入上下文的 token 量;
- 报告:
print_benchmark输出语料 token 总数、图的节点/边数、单次查询平均 token、整体缩减倍数(N× fewer tokens per query)以及逐问题的缩减比。
这一步的意义在于:它为"知识图谱替代全量上下文"的做法提供了一个可重复、可量化的对照数字,而不是营销口径——所有比例都由当前图的实测查询成本算出。
实操要点与前置条件汇总
结合参考文档与源码,使用这些导出通道时值得核对的前提与边界:
- 一切以
graph.json存在为前提:export各子命令的图路径默认为graphify-out/graph.json,找不到会报error: graph not found ... Run /graphify <path> first.并退出(cli.py#L2750-L2752);--graph PATH可显式指定,此时--labels未显式给出会自动取同目录的.graphify_labels.json。 - 社区数据的兜底机制:若
.graphify_analysis.json缺失,CLI 会从graph.json节点上的community属性现场重建社区字典,使wiki、svg、graphml、neo4j等通道不至于静默产出退化产物;但wiki通道即使有重建也会因分析文件缺失而拒绝执行(防数据丢失)。 - 幂等与可重入:Neo4j 与 FalkorDB 的 push 通道、
cypher.txt文件通道全部基于 MERGE,可安全重复执行;graph.json本身的写出路径另有 #479 防静默缩水保护(to_json 在新图节点数少于旧图时拒绝覆盖),导出操作不会与构建操作互相踩踏。 - 凭据管理:推送类命令支持
NEO4J_PASSWORD/FALKORDB_PASSWORD环境变量替代--password,避免密码进入 argv;Neo4j push 必须提供密码,FalkorDB push 凭据可选。 - 可选依赖:neo4j 通道需
pip install neo4j,falkordb 通道需pip install falkordb,svg 通道需pip install matplotlib,缺失时均有明确的报错指引。 - 执行顺序:
--wiki必须在清理步骤之前跑,以保住.graphify_labels.json;基准步骤只在语料超过 5000 词时值得运行,小语料跳过是刻意设计。
这套"一标志一通道"的导出设计,让同一个确定性 AST 知识图谱可以按下游工具的消费习惯各取所需:图数据库拿 Cypher、Markdown 工具链拿 Wiki、浏览器/README 拿 SVG、Gephi 拿 GraphML、agent 编排器拿 MCP 工具接口——而每条通道的写入都是幂等、防注入、可重复执行的。
【免费下载链接】graphifyTurn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.项目地址: https://gitcode.com/GitHub_Trending/graph/graphify
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考