图数据库的相关应用实践模块,如:
概述
选型:
- 不要 cypher:Python思维,不要引入新的技术栈
考虑:
- RedisGraph:已终止生命周期
Neo4j
Neo4j:开源图形数据,使用 Java 开发,
- Attention:Python 牛批,去除 Cypher 的语法
- 都用 java 底层的数据库了,还在意 python 丢失的性能?
- 实用为上
- 图形数据库,又称图形数据库管理系统或 GDBMS,以图形结构的形式存储数据的数据库。
- 但是它
- 基本概念:
- 节点:Node,实体
- 类似于 sql 里的 row
- 标签:Label:实体类型,对节点分组,每个节点或关系可包含多个标签,标签被索引以加快查找
- 类似于 sql 里的表
- 只能通过标签名称来访问节点详细信息
- 关系:Relationship
- 类似于 sql 里的 join
- 属性:Property/attrs:节点与关系的属性,键值对
- 类似于 sql 里的字段
- 可对属性创建索引与约束
- Key 为字符串,Value 为基本类型或基本类型数组
- 数据浏览器
- 节点:Node,实体
- 说明:
- csv 文件的三元组(实体、属性、值),实体与值都是节点,属性是关系。
- 感觉不太对…
- csv 文件的三元组(实体、属性、值),实体与值都是节点,属性是关系。
- 特点:
- 嵌入式
- 基于磁盘
- 具备完全的事务特性
- Java 持久化引擎
- Cypher 查询语言
- 将结构化数据存储在网络 (从数学角度叫做图) 上而不是表中。
- 图数据库
- 支持图属性
- 支持 ACID
- 高可用性,高连通数据
- 支持 320 亿的结点,320 亿的关系结点,640 亿的属性
- Lucene 索引
- 高性能:一秒内搜索亿级节点(但一般不建议搜索全图)
- 应用场景
- 搜索
- 智能问答
- 推荐系统
- todo:OUT 倒计事项
- py2neo 操作,大数量级下慢得一批
- 启动起来,吃了我 4.9G 的内存
- 大内存操作占用大内存后(5.3G),不怎么回收 (4.5G),需要重启 neo4j
工具
Neo4j Browser:命令驱动的客户端,基于 web 的 shell 环境。
- Ctrl+Enter:执行命令
- Ctrl+ up/down:查看上/下一条命令
1
2
3
4
5:help
:help keys # 查看快捷键
:clear
:history
Cypher
Cypher 是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询,和 SQL 很相似,Cypher 语言的关键字不区分大小写,但是属性值,标签,关系类型和变量是区分大小写的。
Cypher:CQL:Neo4j 的图形数据库查询语言
- 特点:
- 声明性模式匹配语言
- 使用 patterns(模式)描述图数据
- 类 sql 风格
- 声明式:描述要找到什么,而不是如何找到它
- 应用:
- 表达式:对于值的操作,如数值操作、字符串操作、关系操作、链表操作、映射表操作、路径操作等
- 图模式:就是出现在 Cypher 查询语句 MATCH 子句中查询模式。Cypher 定义了两种基本查询模式:点模式和关系模式。所谓点模式是一个三元组 (a,L,P),其中 a 为所查询点对应的变量名、L 是所查询的点需要满足的标签集合、P 是所查询的点在属性上所需满足的条件。而关系模式是一个五元组 (d,a,T,P,I),其中 d 为关系模式的方向、a 是所查询关系对应的变量名、T 是所查询关系需要满足的边类型集合、P 是所查询关系在边属性上所需满足的条件、I 表示所查询关系的可以对应多少条边。
- 子句:就是表示一个从表到表到函数。Cypher 中最主要子句的就是 MATCH 子句,表示一个图模式在属性图上的匹配,并将一张空表加入匹配结果进而形成一张新表作为结果。MATCH 子句后面跟的就是图模式,可以是点模式,也可以是点模式加关系模式加另外的模式。除了 MATCH 子句外,Cypher 还提供了 UNWIND 和 WITH 子句。UNWIND 子句用来将链表进行展开,使链表中每一个元素对应表中的一行;WITH 子句用来对表进行映射操作。
- 查询:若干子句组合并以 RETURN 语句结尾或者多个查询的并
比较
| 术语 | Gremlin | Cypher | nGQL |
|---|---|---|---|
| 点 | Vertex | Node | Vertex |
| 边 | Edge | Relationship | Edge |
| 点类型 | Label | Label | Tag |
| 边类型 | label | Relationship Type | edge type |
| 点 ID | vid | id(n) | vid |
| 边 ID | eid | id(r) | 无 |
| 插入 | add | create | insert |
| 删除 | drop | delete | delete/drop |
| 更新属性 | setProperty | set | update |
数据类型
1 | boolean: 布尔文字:true, false |
1 | create:创建,创建节点、关系和属性 |
- 常用 cql 函数
1 | String:使用string字面量 |
基本概念
1 | // --- 节点 --- |
1 | // 创建节点 |
导入
1 | neo4j-admin import --database=graph.db --ignore-extra-columns --ignore-empty-strings --id-type=STRING --skip-duplicate-nodes --bad-tolerance=10000 --nodes=E:\neo4j\import\xxx.csv --relationships=E:\neo4j\import\xxx.csv |
csv 文件
- nodes
movieId:ID:唯一标识,用于后面创建关系:LABEL:标签,多个用:分隔
1 | movieId:ID,title,year:int,:LABEL |
1 | personId:ID,name,:LABEL |
1 | uuid:ID(Person),name:String,:Label |
- relations
role:关系的属性:TYPE:可以理解为关系的标签
1 | :START_ID,role,:END_ID,:TYPE |
1 | :START_ID(Person),:END_ID(Person),:TYPE |
配置文件
1 | 修改第22行load csv时l路径,在前面加个#,可从任意路径读取文件 |
1 | # 浏览器改密码 |
py2neo
#最佳实践
py2neo:通过操作 python 变量,实现操作 neo4j
neo4j:python 基于 bolt 协议连接,比 py2neo 复杂,核心是执行 CQL 语句,OUT
基本使用
1 | pip install py2neo |
1 | from py2neo import Graph, Node, Relationship, Subgraph, NodeMatcher, RelationshipMatcher |
图 -graph
1 | graph.schema.node_labels # 查看节点的所有标签,返回frozenset,通过循环调用返回str |
增
删
改
查
遇到的问题
输出的中文的 unicode 变为正常
1 | # 第230行的 utf-8 改为 unicode-escape |
lancedb
lancedb:矢量数据库
networkx
networkx:用于创建、操作和研究图(网络)结构
- 简单易用、可扩展性强
- 性能不足,OUT
| 量级(节点数) | 边数参考(稀疏图) | 性能表现(纯 Python 环境) | 典型适用场景 |
|---|---|---|---|
| 1k 以内(千级) | 1k~10k | 秒级完成所有操作(遍历、最短路径、社区检测等),无压力 | 教学演示、小规模数据分析、算法原型验证 |
| 1k~10k(万级) | 10k~100k | 常用操作(筛选、统计、简单图算法)流畅;复杂算法(如 Louvain 社区检测)耗时秒级~分钟级 | 科研数据分析、中等规模网络挖掘(如社交小圈子、论文引用网络) |
| 10k~100k(十万级) | 100k~1000k | 简单操作(节点筛选、边遍历)尚可;复杂算法(如最短路径、聚类)耗时显著(分钟级~小时级);内存占用较高(可能达 GB 级) | 需谨慎使用,仅适合无替代方案时的轻量操作(如仅统计节点属性) |
| 100k 以上(百万级 +) | 1000k+ | 操作卡顿严重(小时级甚至无法完成),内存易溢出;复杂算法基本不可用 | 完全不推荐,需换用高性能图计算库 |
NetworkX 本质是「纯 Python 实现的图工具库」,而非「高性能图计算引擎」,限制源于三点:
- 底层实现:节点、边的存储依赖 Python 字典(字典的哈希表结构冗余度高,内存占用大),遍历和计算均为单线程 Python 解释执行,比 C/C++ 实现慢 10~100 倍。
- 内存管理:Python 对大对象的内存回收效率较低,十万级以上节点的图会占用大量内存(例如:10 万节点的稀疏图约占数百 MB 内存,100 万节点可能达数 GB)。
- 算法优化:部分复杂算法(如社区检测、图聚类)未做并行化或底层优化,仅适合小规模验证。
