跳转至

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 refusedNeo4j 未启动检查容器 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"))