Neo4j-07.进阶能力与Graph-Data-Science

越过 CRUD 与导入,Neo4j 的生态插件Graph Data Science(GDS,图数据科学库)把能力扩展到图算法、批量 ETL、语义检索与 LLM 知识增强。本文介绍生产中最常用的进阶组件及适用边界。

段末注释:GDS 为 Neo4j Graph Data Science 插件,在内存图投影上运行 PageRank、社区发现等算法;与在线 Cypher 遍历互补。

前置Neo4j-05.查询进阶与性能调优


一、APOC:Cypher 的「标准库扩展」

APOC(Awesome Procedures on Cypher)提供数百个过程(procedure)与函数(function),涵盖导入导出、图重构、文本处理、触发器等。

1.1 安装

Docker:

1
-e NEO4J_PLUGINS='["apoc"]'

或手动将 apoc-*.jar 放入 plugins/,并在 neo4j.conf 配置:

1
dbms.security.procedures.unrestricted=apoc.*

1.2 常用能力

类别 示例
导入导出 apoc.export.csv.*apoc.load.json
图重构 apoc.refactor.mergeNodes
路径 apoc.path.expandConfig
文本 apoc.text.regexGroups
定时 apoc.periodic.iterateapoc.periodic.commit
元数据 apoc.meta.graph

合并重复节点:

1
2
3
4
5
6
MATCH (n:Person)
WITH n.email AS email, collect(n) AS nodes
WHERE size(nodes) > 1
CALL apoc.refactor.mergeNodes(nodes, {properties: 'combine', mergeRels: true})
YIELD node
RETURN count(node);

1.3 与原生 Cypher 5 的重叠

Neo4j 5 内置了 LOAD CSV ... IN TRANSACTIONS、部分子查询能力,新项目中 APOC 主要用于:JDBC 加载、复杂 refactor、导出、periodic 批处理。


二、Graph Data Science(GDS)

GDS 在内存图投影(graph projection)上运行分析算法,结果写回节点/关系属性或导出。

2.1 安装

1
-e NEO4J_PLUGINS='["graph-data-science"]'

验证:

1
RETURN gds.version();

2.2 典型工作流

1
2
3
4
5
flowchart LR
A[(Neo4j 存储图)] --> B[Project 内存图]
B --> C[运行算法]
C --> D[Write 回节点属性]
D --> E[Cypher 在线查询]

2.3 投影示例

1
2
3
4
5
CALL gds.graph.project(
'ppi-graph',
'Protein',
{ INTERACTS_WITH: { orientation: 'UNDIRECTED', properties: 'score' } }
);

2.4 常用算法

算法 用途 调用示例
PageRank 节点重要性 gds.pageRank.write
Louvain 社区发现 gds.louvain.write
WCC 弱连通分量 gds.wcc.write
Node Similarity 相似节点 gds.nodeSimilarity.write
Shortest Path 加权最短路 gds.shortestPath.dijkstra
FastRP 图嵌入 gds.fastRP.write

PageRank 写回:

1
2
3
4
5
6
CALL gds.pageRank.write('ppi-graph', {
writeProperty: 'pagerank',
maxIterations: 20,
dampingFactor: 0.85
})
YIELD nodePropertiesWritten, ranIterations;

在线查询:

1
2
3
4
MATCH (p:Protein)
WHERE p.pagerank IS NOT NULL
RETURN p.uniprot, p.name, p.pagerank
ORDER BY p.pagerank DESC LIMIT 20;

2.5 释放投影

1
CALL gds.graph.drop('ppi-graph');

大图注意:投影内存 ≈ 子图规模;在专用 analytics 节点或低峰运行。


三、全文与向量检索

3.1 全文索引(内置 Lucene)

1
2
3
4
5
6
CREATE FULLTEXT INDEX doc_search IF NOT EXISTS
FOR (d:Document) ON EACH [d.title, d.body];

CALL db.index.fulltext.queryNodes('doc_search', 'polymerase AND fidelity~')
YIELD node, score
RETURN node.title, score;

3.2 向量索引 + 语义检索

配合 embedding 模型(OpenAI、本地 sentence-transformers):

1
2
3
4
5
6
7
8
// 写入 embedding(1536 维示例)
MATCH (d:Document {id: $id})
SET d.embedding = $vector;

// 相似度查询(Neo4j 5.13+ 向量索引 API 演进较快,以官方文档为准)
CALL db.index.vector.queryNodes('doc_embedding', 10, $queryVector)
YIELD node, score
RETURN node.title, score;

四、LLM + 知识图谱(RAG 增强)

1
2
3
4
5
6
7
flowchart TD
Q[用户问题] --> E[Embedding 问题]
E --> V[向量检索 Neo4j 实体/文档]
V --> SG[子图扩展 Cypher 1~2 跳]
SG --> CTX[结构化上下文]
CTX --> LLM[大语言模型生成]
LLM --> A[答案 + 引用实体]

价值:向量检索找入口节点,Cypher 扩展拉取相关事实三元组,减少 LLM 幻觉(hallucination)。

4.1 LangChain 集成(Python 示意)

1
2
3
4
5
6
7
8
9
10
11
from langchain_community.graphs import Neo4jGraph
from langchain.chains import GraphCypherQAChain
from langchain_openai import ChatOpenAI

graph = Neo4jGraph(url="bolt://localhost:7687", username="neo4j", password="...")
chain = GraphCypherQAChain.from_llm(
ChatOpenAI(temperature=0),
graph=graph,
verbose=True,
)
chain.invoke({"query": "EGFR 与哪些蛋白互作?"})

4.2 实践建议

建议
Schema 提示 把节点标签、关系类型注入 LLM prompt
只读账号 RAG 查询用 reader 角色
子图深度 限制 1~2 跳,避免上下文爆炸
事实溯源 RETURN 节点 id / doi 供引用

五、Neo4j Bloom(可视化)

Bloom 是企业版/Aura 的无代码图探索工具:

  • 自然语言-ish 搜索(Near natural language search)
  • 场景视角(Perspective)预定义标签与关系
  • 适合业务人员探索,开发仍用 Browser + Cypher

社区版可用 Browser 图视图替代,功能较简。


六、多数据库与 Fabric(企业版)

能力 说明
多数据库 同一实例隔离多个图(Neo4j 5 社区版已支持)
Fabric 跨库、跨实例联合查询(企业版)

Fabric 查询示意:

1
2
3
4
5
6
7
USE fabric.graph1
MATCH (a:Person)-[:KNOWS]->(b)
RETURN a, b
UNION
USE fabric.graph2
MATCH (c:Person)-[:WORKS_AT]->(d)
RETURN c, d;

适用:多租户、历史归档库与热库分离。


七、触发器与变更监听

APOC 触发器(实验性,生产谨慎):

1
2
3
4
5
CALL apoc.trigger.add('onPersonCreate', '
UNWIND $createdNodes AS n
WITH n WHERE n:Person
SET n.createdAt = timestamp()
', {phase: 'after'});

更可靠的做法:应用层写图CDC 出 Kafka,避免数据库内逻辑过重。


八、Neo4j Streams / Kafka

Neo4j Streams 插件(社区/企业)可将节点/关系变更推送到 Kafka,实现 Graph → 事件驱动架构。与 Debezium 反向(SQL → Neo4j)组合,可构建双向同步(复杂度高,需严格幂等设计)。


九、进阶能力选型

需求 推荐
批量 ETL、合并节点 APOC
PageRank / 社区发现 GDS
语义搜索 向量索引 + embedding
问答 LangChain + Cypher QA
业务探索 Bloom
跨库查询 Fabric(企业)

十、小结

  • APOC 补 Cypher 工程力;GDS 补图算法——先 project,再 algorithm,再 write 回。
  • RAG + 图:向量找入口,Cypher 扩事实,是知识图谱与大模型结合的主流模式。
  • 大图算法不要硬写 Cypher;Bloom/Fabric 偏企业场景,社区版用 Browser + 多库即可。
下一篇 内容
Neo4j-08.局限性与生产实践 超级节点、成本、上线清单
-------------本文结束感谢您的阅读-------------