Hello World - Cypher 图查询入门

知识库
知识库文档
/tech-stacks/neo4j/examples/Hello World - Cypher 图查询入门.md

文档

Neo4j Hello World:Cypher 图查询入门

目标

创建第一个图数据库,用 Cypher 建节点、建关系、查询,感受图数据模型的直观性。

完整代码

在 Neo4j Browser(http://localhost:7474)中执行:

1. 创建节点

-- 创建人物节点
CREATE (:Person {name: '张三', age: 21, major: '计算机科学'});
CREATE (:Person {name: '李四', age: 22, major: '数学'});
CREATE (:Person {name: '王五', age: 20, major: '计算机科学'});
CREATE (:Person {name: '赵六', age: 23, major: '物理'});

2. 创建课程节点

CREATE (:Course {name: '数据库原理', credits: 4});
CREATE (:Course {name: '算法导论', credits: 3});
CREATE (:Course {name: '线性代数', credits: 3});

3. 创建关系

-- 用 MERGE 匹配已有节点并建立关系
MATCH (a:Person {name: '张三'}), (c:Course {name: '数据库原理'})
CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c);

MATCH (a:Person {name: '张三'}), (c:Course {name: '算法导论'})
CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c);

MATCH (a:Person {name: '李四'}), (c:Course {name: '线性代数'})
CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c);

MATCH (a:Person {name: '王五'}), (c:Course {name: '数据库原理'})
CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c);

MATCH (a:Person {name: '王五'}), (c:Course {name: '算法导论'})
CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c);

-- 好友关系
MATCH (a:Person {name: '张三'}), (b:Person {name: '王五'})
CREATE (a)-[:FRIEND_OF {since: 2023}]->(b);

4. 常用查询

-- 查询某学生的选课
MATCH (p:Person {name: '张三'})-[:ENROLLED_IN]->(c:Course)
RETURN p.name AS 学生, c.name AS 课程, c.credits AS 学分;

-- 查询某课程的所有学生
MATCH (p:Person)-[:ENROLLED_IN]->(c:Course {name: '数据库原理'})
RETURN p.name AS 学生, p.major AS 专业;

-- 找出好友的选课(推荐系统雏形)
MATCH (me:Person {name: '张三'})-[:FRIEND_OF]->(friend:Person)-[:ENROLLED_IN]->(c:Course)
WHERE NOT (me)-[:ENROLLED_IN]->(c)
RETURN friend.name, c.name AS 推荐课程;

-- 最短路径(张三到赵六的关系路径)
MATCH path = shortestPath((a:Person {name: '张三'})-[*]-(b:Person {name: '赵六'}))
RETURN path;

Python Neo4j 驱动版

# pip install neo4j
from neo4j import GraphDatabase

URI = "bolt://localhost:7687"
AUTH = ("neo4j", "password123")

driver = GraphDatabase.driver(URI, auth=AUTH)

def create_data(tx):
    """批量创建节点和关系"""
    tx.run("""
        CREATE (:Person {name: '张三', age: 21, major: '计算机科学'})
        CREATE (:Person {name: '李四', age: 22, major: '数学'})
        CREATE (:Person {name: '王五', age: 20, major: '计算机科学'})
        CREATE (:Course {name: '数据库原理', credits: 4})
        CREATE (:Course {name: '算法导论', credits: 3})
        CREATE (:Course {name: '线性代数', credits: 3})
    """)
    
    tx.run("""
        MATCH (a:Person {name: '张三'}), (c:Course {name: '数据库原理'})
        CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c)
    """)
    tx.run("""
        MATCH (a:Person {name: '张三'}), (c:Course {name: '算法导论'})
        CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c)
    """)
    tx.run("""
        MATCH (a:Person {name: '王五'}), (c:Course {name: '数据库原理'})
        CREATE (a)-[:ENROLLED_IN {semester: '2024-秋季'}]->(c)
    """)

def query_enrollments(tx):
    result = tx.run("""
        MATCH (p:Person)-[:ENROLLED_IN]->(c:Course)
        RETURN p.name AS 学生, c.name AS 课程
    """)
    for record in result:
        print(f"{record['学生']} -> {record['课程']}")

with driver.session() as session:
    session.execute_write(create_data)
    session.execute_read(query_enrollments)

driver.close()

预期输出

学生     课程
张三  -> 数据库原理
张三  -> 算法导论
王五  -> 数据库原理

-- 推荐查询输出:
李四  -> 数据库原理   (张三的好友王五也在上这门课)

关键点

  • (Node)-[:RELATION]->(Node) 是 Cypher 的核心语法
  • MATCH 匹配模式,RETURN 返回结果
  • 图查询天然支持多跳关联(*1..n)
  • neo4j driver 的 execute_write / execute_read 是事务安全的

信息

路径
/tech-stacks/neo4j/examples/Hello World - Cypher 图查询入门.md
更新时间
2026/5/31