一、Neo4j 图数据库
Neo4j 是一个高性能的、原生的图数据库。它不采用传统的行和列的表格结构,而是使用节点和关系的图结构来存储和管理数据。
1、Neo4j 安装 - Mac Brew 版
(1)安装 Neo4j
安装了 Homebrew 后直接在终端输入以下命令即可:
brew install neo4j
安装后,Neo4j 浏览器可通过 http://localhost:7474 访问。
(2)登录 Neo4j
【1】在登录页面填写信息:
- Connect URL:输入
neo4j://localhost:7687 - Authentication type:保持为 "Username / Password"
- Username:输入
neo4j - Password:首次连接时输入默认密码
neo4j点击蓝色的 Connect 按钮。
【2】首次连接成功后,系统会强制要求修改默认密码:当前密码 neo4j,设置一个新的安全密码(请务必记住)。
【3】测试连接 连接成功后,在顶部的命令行中输入 Cypher 查询语句,例如:
MATCH (n) RETURN n LIMIT 10;
2、Neo4j 快速入门
【1】我们点击左边栏的星星图标,在 Example Graphs 中选择 Movie Graph,点击运行,就会弹出一个关于电影图谱的教程。
【2】创建图谱 点击灰色代码框,创建图谱的代码会自动复制到代码框,点击运行,即可看到创建的电影图谱。
【3】查找 下面是一些关于查找的语句:查找名叫 Tom Hanks 的演员、查找标题为 Cloud Atlas 的电影、查找 10 个人、查找在 20 世纪 90 年代上映的电影。
【4】询问 后续还有一些查询语句教程不一一列举了,感兴趣的同学可以自行运行。
3、Neo4j 基本操作
接下来我们以麦当劳为背景,用 Neo4j 的 Cypher 查询语言演示基本增删改查操作。
下面我们建立一个简单的图谱,包含两种节点和一种关系:
- 节点类型 1:餐厅
- 属性:名称,地址,开业年份
- 节点类型 2:产品
- 属性:名称,价格,类别
- 关系类型:供应
- 属性:自何时起供应
(1)增操作
【1】创建节点
CREATE (r:餐厅 {名称:"麦当劳", 地址:"某路", 开业年份:2020});
【2】创建关系
MATCH (r:餐厅 {名称:"麦当劳"}), (p:产品 {名称:"汉堡"})
CREATE (r)-[:供应 {自何时起供应:"2020-01-01"}]->(p);
(2)查操作
【1】查找所有餐厅
MATCH (r:餐厅) RETURN r;
【2】查找特定餐厅供应的所有产品
MATCH (r:餐厅 {名称:"麦当劳"})-[s:供应]->(p:产品)
RETURN p;
【3】查找供应可乐的所有餐厅
MATCH (r:餐厅)-[s:供应]->(p:产品 {名称:"可乐"})
RETURN r;
【4】多跳查询 - 查找与 MC 销售同类产品的其他餐厅
MATCH (r1:餐厅)-[:供应]->(p:产品)<-[:供应]-(r2:餐厅)
WHERE r1 <> r2 AND p.名称 = "可乐"
RETURN r1, r2;
【5】路径查询 - 查找两家餐厅通过共同产品产生的关联
MATCH path = (r1:餐厅)-[:供应]->(p:产品)<-[:供应]-(r2:餐厅)
RETURN path;
(3)改操作
【1】更新节点属性
MATCH (r:餐厅 {名称:"麦当劳"}) SET r.地址 = "新地址";
【2】新增节点属性
MATCH (r:餐厅 {名称:"麦当劳"}) SET r.评分 = 4.5;
【3】更新关系属性
MATCH (r:餐厅)-[s:供应]->(p:产品) SET s.自何时起供应 = "2021-01-01";
(4)删操作
【1】删除关系
MATCH (r:餐厅)-[s:供应]->(p:产品) DELETE s;
【2】删除节点(必须先删除其所有关系)
MATCH (n) DETACH DELETE n;
【3】删除所有节点
MATCH (n) WHERE NOT EXISTS((n)--()) DELETE n;
通过以上麦当劳的例子,我们可以看到 Neo4j 的操作非常直观:
CREATE/MERGE:对应 SQL 的 INSERT,用于创建节点和关系。MATCH:对应 SQL 的 SELECT ... FROM,是查询的起点,用于定位图形中的模式。WHERE:对应 SQL 的 WHERE,用于过滤结果。SET:对应 SQL 的 UPDATE,用于更新属性。DELETE/DETACH DELETE:对应 SQL 的 DELETE,用于删除元素。
Neo4j 的核心优势在于通过 MATCH 子句描述关联模式,例如 (餐厅)-[供应]->(产品),这使得查询复杂的关系网络变得简单和高效。
4、安装 py2neo
py2neo 是 Python 连接和操作 Neo4j 图数据库的主要工具库,适用于需要处理复杂关系数据的应用场景。
pip install py2neo
二、数据预处理
数据预处理包括数据清洗、实体识别等步骤,目的是将原始数据转换为适合构建知识图谱的格式。
1、数据清洗
数据质量要求:
- 补全缺失值:对于明显缺失的信息(如设备型号),可以标记为【缺失】或根据上下文推断。
- 格式标准化:将日期统一为【YYYY-MM-DD】格式。
- 去除重复值:删除重复的条目。
2、知识建模
我们需要从业务角度理解数据,设计出合理的图谱结构。
(1)识别实体
实体是知识图谱中的节点。在我的数据集中,可以识别出以下主要实体类型:
- 订单记录:核心实体,每一笔订单就是一个销售事件。
- 产品:订单中的商品。例如,'生日蛋糕'、'马卡龙'、'手冲咖啡'。数据中产品名称和产品类别是其属性。
- 配方标准:制作产品的依据和标准。数据中配方名称、配料序号、制作要点等是其属性。
- 客户反馈:客户对订单或产品的评价与建议。
- 促销活动:与订单关联的营销方案。
- 门店:订单发生的背景。
(2)识别实体属性
属性是描述实体的键值对。
- 订单记录的属性:下单时间、订单描述、订单金额、是否加急、订单状态、支付方式、配送地址。
- 产品的属性:产品名称、产品类别、规格、单价、保质期、产品编号。
- 配方标准的属性:配方名称、配料序号、制作步骤、所需时间、适用产品。
- 客户反馈的属性:反馈内容、评分。
- 促销活动的属性:活动名称、折扣力度、适用条件。
- 门店的属性:门店地址、营业时间、联系电话。
(3)识别关系
关系是连接实体的边,是图谱价值的体现。
- 门店 -- 提供 --> 产品
- 订单记录 -- 产生于 --> 门店
- 订单记录 -- 包含 --> 产品
- 订单记录 -- 触发 --> 促销活动
- 订单记录 -- 收到 --> 客户反馈
- 产品 -- 依据 --> 配方标准
- 配方标准 -- 适用于 --> 产品
三、搭建知识图谱
下面代码为简化后的模板代码,需要根据自己的数据集进行修改后再运行。
from py2neo import Graph, Node, Relationship
# 连接数据库
graph = Graph("http://localhost:7474", auth=("neo4j", "your_password"))
# 创建节点
node = Node("Product", name="Burger", price=10)
graph.create(node)
# 创建关系
restaurant = graph.find_one(Node("Restaurant"), "name", "McDonald")
rel = Relationship(restaurant, "SUPPLY", node)
graph.create(rel)


