文档
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 是事务安全的