Neo4j 图数据库
Neo4j 是最流行的图数据库,用节点和关系来存储数据,特别擅长处理复杂关联关系,如基因调控网络、蛋白互作网络、代谢通路等生信中常见的网络数据。
核心知识点
| 知识点 | 说明 |
|---|
| 数据库类型 | 原生图数据库(Property Graph Model) |
| 最新版本 | 2025.x(日历版本号,2025 年起) |
| 查询语言 | Cypher(直观的图查询语言) |
| 核心优势 | 关系查询极快、直观的图模型、Cypher 语言简洁 |
| 适用场景 | 基因网络、蛋白互作、知识图谱、推荐系统 |
| 新功能 | Infinigraph(100TB+ 分布式)、向量存储、ABAC 权限 |
| 许可证 | Community(GPL)/ Enterprise(商业) |
安装配置
Docker 安装(推荐)
# 用 Docker 运行 Neo4j
docker run -d \
--name neo4j \
-p 7474:7474 \ # Web 浏览器端口
-p 7687:7687 \ # Bolt 协议端口
-e NEO4J_AUTH=neo4j/password123 \ # 用户名/密码
-v neo4j_data:/data \ # 数据持久化
neo4j:latest
# 访问 Web 控制台: http://localhost:7474
# 用 neo4j/password123 登录
基本使用
1. Cypher 基本语法
// === 创建节点 ===
// 创建基因节点
CREATE (g:Gene {name: "TP53", chromosome: "chr17", type: "tumor_suppressor"})
// 创建多个节点
CREATE (g1:Gene {name: "BRCA1", chromosome: "chr17"})
CREATE (g2:Gene {name: "EGFR", chromosome: "chr7"})
CREATE (p1:Pathway {name: "DNA Repair", category: "repair"})
// === 创建关系 ===
// 先匹配节点,再建关系
MATCH (g1:Gene {name: "TP53"}), (g2:Gene {name: "BRCA1"})
CREATE (g1)-[:INTERACTS_WITH {score: 0.95}]->(g2)
// 创建基因-通路关系
MATCH (g:Gene {name: "BRCA1"}), (p:Pathway {name: "DNA Repair"})
CREATE (g)-[:BELONGS_TO]->(p)
// === 查询 ===
// 查询所有基因
MATCH (g:Gene) RETURN g
// 条件查询
MATCH (g:Gene) WHERE g.chromosome = "chr17" RETURN g.name, g.chromosome
// 查询关系
MATCH (g1:Gene)-[r:INTERACTS_WITH]->(g2:Gene)
RETURN g1.name, r.score, g2.name
// 路径查询(找两个基因之间的所有路径)
MATCH path = (g1:Gene {name: "TP53"})-[*1..3]-(g2:Gene {name: "EGFR"})
RETURN path
2. Python 操作(neo4j 驱动)
from neo4j import GraphDatabase # pip install neo4j
# 连接 Neo4j
driver = GraphDatabase.driver(
"bolt://localhost:7687", # Bolt 协议地址
auth=("neo4j", "password123") # 用户名密码
)
# 创建节点和关系
with driver.session() as session:
# 创建基因
session.run("""
CREATE (g:Gene {name: $name, chromosome: $chr})
""", name="GAPDH", chr="chr12")
# 查询
result = session.run("""
MATCH (g:Gene)
WHERE g.chromosome = $chr
RETURN g.name AS name, g.chromosome AS chr
""", chr="chr17")
for record in result:
print(f"基因: {record['name']}, 染色体: {record['chr']}")
driver.close()
高级用法
1. 构建基因互作网络
// 批量导入基因互作数据
LOAD CSV WITH HEADERS FROM 'file:///interactions.csv' AS row
MERGE (g1:Gene {name: row.gene1}) // MERGE 避免重复创建
MERGE (g2:Gene {name: row.gene2})
CREATE (g1)-[:INTERACTS_WITH {
score: toFloat(row.score),
source: row.database
}]->(g2)
// 查找某个基因的所有互作伙伴
MATCH (g:Gene {name: "TP53"})-[:INTERACTS_WITH]-(partner:Gene)
RETURN partner.name, COUNT(*) AS interactions
ORDER BY interactions DESC
LIMIT 20
// 查找互作网络中的中心节点(度中心性)
MATCH (g:Gene)-[r:INTERACTS_WITH]-()
RETURN g.name, COUNT(r) AS degree
ORDER BY degree DESC
LIMIT 10
2. 最短路径分析
// 两个基因之间的最短路径
MATCH path = shortestPath(
(g1:Gene {name: "TP53"})-[*]-(g2:Gene {name: "EGFR"})
)
RETURN path, length(path) AS path_length
// 所有最短路径
MATCH path = allShortestPaths(
(g1:Gene {name: "TP53"})-[*..5]-(g2:Gene {name: "BRCA1"})
)
RETURN path
3. 图算法(GDS 库)
// 使用 Graph Data Science 库进行图算法分析
// PageRank(找网络中最重要的基因)
CALL gds.pageRank.stream('gene_graph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS gene, score
ORDER BY score DESC
LIMIT 10
// 社区检测(找基因模块)
CALL gds.louvain.stream('gene_graph')
YIELD nodeId, communityId
RETURN gds.util.asNode(nodeId).name AS gene, communityId
ORDER BY communityId
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
Connection refused | Neo4j 未启动 | 检查容器 docker ps |
Authentication failed | 密码错误 | 检查用户名密码 |
Unable to create node | 内存不足 | 增加 JVM 堆内存 |
| CSV 导入失败 | 文件路径错 | 放到 Neo4j 的 import 目录下 |
| 查询太慢 | 缺少索引 | 对常查询的属性建索引 |
速查表
// ===== Neo4j Cypher 速查表 =====
// 创建
CREATE (n:Label {prop: "value"}) // 创建节点
CREATE (a)-[:REL_TYPE {prop: val}]->(b) // 创建关系
// 查询
MATCH (n:Label) RETURN n // 查所有
MATCH (n) WHERE n.prop = "value" RETURN n // 条件查
MATCH (a)-[r]->(b) RETURN a, r, b // 查关系
// 更新
MATCH (n {name: "x"}) SET n.prop = "new" // 更新属性
MATCH (n {name: "x"}) SET n:NewLabel // 添加标签
// 删除
MATCH (n {name: "x"}) DELETE n // 删除节点
MATCH (n {name: "x"}) DETACH DELETE n // 删除节点及关系
// 索引
CREATE INDEX FOR (n:Gene) ON (n.name) // 创建索引
// 路径
shortestPath((a)-[*]-(b)) // 最短路径
allShortestPaths((a)-[*..5]-(b)) // 所有最短路径
// 聚合
RETURN COUNT(n), AVG(n.score), COLLECT(n.name)
// Python: pip install neo4j
// driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j","pass"))