一、什么是图数据库?为什么用 Neo4j?

1.1 什么是图数据库?

图数据库(Graph Database)是一种专门用于存储和处理图结构数据的 NoSQL 数据库。它以节点(Node) 和 关系(Relationship) 为核心建模元素,非常适合表示实体之间的复杂连接关系。

  • 节点:代表现实世界中的实体(如人、产品、地点等)。
  • 关系:代表节点之间的连接(如“朋友”、“购买”、“位于”等),且关系本身也可以携带属性。
  • 与传统的关系型数据库不同,图数据库不依赖于表和外键,而是直接将关系作为一等公民进行存储和查询。

1.2 为什么选择 Neo4j?

Neo4j 是目前最流行、功能最完善的原生图数据库之一,具有以下优势:

  • ✅ 原生图存储引擎:专为图结构优化,性能卓越。
  • ✅ 直观的查询语言 Cypher:类似自然语言,易学易用。
  • ✅ 强大的可视化能力:通过浏览器界面可直接查看图结构。
  • ✅ 活跃的社区和丰富的文档:适合初学者快速上手。
  • ✅ 支持 ACID 事务:保证数据一致性。
  • ✅ 开源版本免费:Neo4j Community Edition 可用于开发和小规模生产。

典型应用场景包括:

  • 社交网络分析
  • 推荐系统
  • 欺诈检测
  • 知识图谱构建
  • 网络与 IT 运维拓扑管理

二、安装 Neo4j(推荐 v5.x)

本教程以 Neo4j Community Server v5.x 为例(适用于 Windows / macOS / Linux)。

2.1 下载 Neo4j

  1. 访问官方下载页面:https://neo4j.com/download-center/
  2. 选择 Neo4j Community Edition(注意选择 v5.x 版本,如 5.18)
  3. 根据你的操作系统下载对应安装包:
    • Windows:.exe 安装程序
    • macOS:.dmg 或使用 Homebrew
    • Linux:.tar.gz 压缩包

2.2 安装方式(以 Linux/macOS 为例)

# 解压(Linux/macOS)
tar -xf neo4j-community-5.x.x-unix.tar.gz
cd neo4j-community-5.x.x

# 启动服务(首次启动会提示接受许可协议)
bin/neo4j console

💡 Windows 用户:运行 .exe 安装程序后,可通过开始菜单启动 Neo4j 服务。

2.3 初始配置

首次启动后,Neo4j 会要求你设置初始密码(默认用户名为 neo4j)。请记住该密码,后续登录浏览器界面时需要使用。


三、启动浏览器界面(http://localhost:7474

  1. 确保 Neo4j 服务正在运行。
  2. 打开浏览器,访问:http://localhost:7474
  3. 首次登录时:
    • Connect URL: bolt://localhost:7687
    • Username: neo4j
    • Password: 你设置的初始密码
  4. 登录成功后,你会看到 Neo4j Browser 界面,包含:
    • 查询编辑区(顶部)
    • 结果展示区(中间)
    • 图形可视化面板(可切换为表格/文本视图)

✅ 小技巧:在查询框中输入 :play movies 并回车,可加载一个示例电影数据库进行练习!

四、核心概念

4.1 节点(Node)

  • 表示实体,如一个人、一本书、一个城市。
  • 可以拥有多个 标签(Label) 来分类(如 :Person:Movie)。
  • 可以包含 属性(Property)(键值对,如 {name: "Alice", age: 30})。

4.2 关系(Relationship)

  • 连接两个节点,具有方向性(A → B)。
  • 必须有 类型(Type)(如 :FRIENDS_WITH:ACTED_IN)。
  • 也可以拥有属性(如 {since: 2020})。

4.3 属性(Property)

  • 键值对(key-value),存储在节点或关系上。
  • 值可以是字符串、数字、布尔值、列表等(Neo4j 不支持嵌套对象)。

4.4 标签(Label)

  • 用于对节点进行分组(类似关系型数据库中的“表名”)。
  • 一个节点可以有多个标签(如 (:User:Admin))。
  • 不能用于关系。

📌 示例图结构:

(Alice:Person {name:"Alice"}) -[:FRIENDS_WITH {since:2020}]-> (Bob:Person {name:"Bob"})
  • ():表示一个节点。
  • Alice:这是该节点的变量名(或别名),在查询中可用于引用该节点(例如在 RETURN Alice 中)。它不是存储在数据库中的数据,仅在当前查询上下文中有效。
  • :Person:这是节点的标签(Label)。标签用于对节点进行分类,类似于关系型数据库中的“表名”。一个节点可以有多个标签(如 :Person:User),但这里只有一个:Person
  • {name:"Alice"}:这是节点的属性(Properties),以键值对形式存在。这里表示该节点有一个属性 name,其值为 "Alice"
  • - 和 ->:表示有向关系,箭头方向从左(Alice)指向右(Bob)。如果写成 -[:FRIENDS_WITH]-(无箭头),则表示无向(在匹配时忽略方向)。
  • [:FRIENDS_WITH]
    • 方括号 [] 表示一个关系;
    • :FRIENDS_WITH 是关系的类型(Type)。关系必须有且仅有一个类型(不能像节点那样有多个标签,类型都是自定义的,无系统默认关系,建议大写加下划线,比如此处可以改为FRIENDS)。
  • {since:2020}:这是关系的属性。表示这段友谊从 2020 年开始。

 


五、Cypher 基础语法

Cypher 是 Neo4j 的声明式图查询语言,语法简洁直观。

5.1 常用关键字

关键字作用说明
CREATE 创建节点或关系
MATCH 匹配图中的模式(类似 SQL 的 SELECT)
RETURN 返回查询结果
WHERE 添加过滤条件
SET 更新节点或关系的属性
DELETE 删除节点或关系(注意:删除节点前需先删除其所有关系)

5.2 基础操作示例

示例 1:创建一个带属性的节点

CREATE (:Person {name: "Alice"});
       :Person 是标签
       {name: "Alice"} 是属性

示例 2:创建两个节点并建立关系

CREATE (a:Person {name: "Alice"}),
       (b:Person {name: "Bob"}),
       (a)-[:FRIENDS_WITH {since: 2020}]->(b);

示例 3:查询所有 Person 节点

MATCH (p:Person)
RETURN p;

示例 4:查找名字为 "Alice" 的人

MATCH (p:Person {name: "Alice"})
RETURN p;

示例 5:使用 WHERE 过滤

MATCH (p:Person)
WHERE p.name = "Alice"
RETURN p.name, p.age;

示例 6:更新属性

MATCH (p:Person {name: "Alice"})
SET p.age = 30
RETURN p;

示例 7:删除关系(先匹配再删)

MATCH (a:Person)-[r:FRIENDS_WITH]->(b:Person)
WHERE a.name = "Alice" AND b.name = "Bob"
DELETE r;

示例 8:删除节点(必须先删关系!)

MATCH (p:Person {name: "Alice"})
DETACH DELETE p;  // DETACH 会自动删除所有关联关系

⚠️ 注意:普通 DELETE 不能删除仍有关系的节点,必须使用 DETACH DELETE


posted on 2025-12-04 15:19  程序员丁先生  阅读(0)  评论(0)    收藏  举报