graphify 的额外导出通道全解析:Wiki、Neo4j、FalkorDB、SVG、GraphML、MCP 服务器与 token 缩减基准
2026/9/7 18:56:42 网站建设 项目流程

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分发结构完全一致:htmlcallflow-htmlobsidianwikisvggraphmlneo4jfalkordb每个子命令走各自的实现函数,不会连带执行其他导出。

整份文档覆盖了构建流程的 Step 6b 到 Step 8 五个阶段,下表是完整的"标志 → 步骤 → 命令"映射:

文档步骤触发标志命令产物 / 效果
Step 6b Wiki--wikigraphify export wikigraphify-out/wiki/下的 Markdown 文章,index.md为 agent 入口
Step 7 Neo4j--neo4jgraphify export neo4jgraphify-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--falkordbgraphify export falkordb可移植的cypher.txt(OpenCypher 语句)
Step 7a FalkorDB push--falkordb-push <uri>graphify export falkordb --push falkordb://localhost:6379直接推送到运行中的 FalkorDB 实例
Step 7b SVG--svggraphify export svggraphify-out/graph.svg,可嵌入 Markdown/Obsidian/Notion
Step 7c GraphML--graphmlgraphify export graphmlgraphify-out/graph.graphml,供 Gephi、yEd 打开
Step 7d MCP--mcp$(cat graphify-out/.graphify_python) -m graphify.serve graphify-out/graph.jsonstdio MCP 服务器,向 agent 暴露 7 个图查询工具
Step 8 基准total_words > 5000graphify benchmark终端打印的 token 缩减报告

Step 6b:Wiki 导出(仅--wiki

文档给出的操作只有一行:

graphify export wiki

但文档特别强调了两条执行约束,这里结合源码逐一印证:

  1. 必须在 Step 9(清理)之前运行,因为此步骤依赖graphify-out/.graphify_labels.json中尚存的社区标签。在 CLI 的 wiki 分支 中,labels正是从该文件加载后传入to_wiki的。
  2. 社区数据是硬前置。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属性(如CodeDocument);
  • 边语句: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:6379scheme 只是信息性的——实现里用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,未安装时会抛出带安装指引的ImportErrorpip 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_prsget_pr_impacttriage_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)以及逐问题的缩减比。

这一步的意义在于:它为"知识图谱替代全量上下文"的做法提供了一个可重复、可量化的对照数字,而不是营销口径——所有比例都由当前图的实测查询成本算出。

实操要点与前置条件汇总

结合参考文档与源码,使用这些导出通道时值得核对的前提与边界:

  1. 一切以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
  2. 社区数据的兜底机制:若.graphify_analysis.json缺失,CLI 会从graph.json节点上的community属性现场重建社区字典,使wikisvggraphmlneo4j等通道不至于静默产出退化产物;但wiki通道即使有重建也会因分析文件缺失而拒绝执行(防数据丢失)。
  3. 幂等与可重入:Neo4j 与 FalkorDB 的 push 通道、cypher.txt文件通道全部基于 MERGE,可安全重复执行;graph.json本身的写出路径另有 #479 防静默缩水保护(to_json 在新图节点数少于旧图时拒绝覆盖),导出操作不会与构建操作互相踩踏。
  4. 凭据管理:推送类命令支持NEO4J_PASSWORD/FALKORDB_PASSWORD环境变量替代--password,避免密码进入 argv;Neo4j push 必须提供密码,FalkorDB push 凭据可选。
  5. 可选依赖:neo4j 通道需pip install neo4j,falkordb 通道需pip install falkordb,svg 通道需pip install matplotlib,缺失时均有明确的报错指引。
  6. 执行顺序--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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询