从 Python 程序发出图数据库指令
这节课不追求一次写很多代码,而是把连接、增查改删、事务和错误处理这条主线走稳。
用 Python Driver 建立入口,检查数据库能不能连通。
围绕增、查、改、删练习 `execute_query()` 与参数传递。
把多句写操作放进同一个可靠边界,理解成功与失败要一起处理。
学习结果处理、异常处理和一个可复用的小脚本结构。
保存学号、姓名、年级。课堂中用它代表学习者。
保存课程编号、课程名、学时。课堂中用它代表学习资源。
保存技能名称和类别。课堂中用它连接课程与岗位能力。
lesson_tag,便于安全清理。创建 Driver 对象。Driver 负责维护连接信息和连接池,通常一个应用创建一个就够。
只检查是否能和数据库通信,不执行业务查询。适合课前检查和启动自检。
用上下文管理器自动关闭 Driver,避免连接资源一直占着不放。
把 `URI`、`AUTH`、`DATABASE` 放入一个 `dict`,再用字典里的值创建 Driver。
仍然调用 `verify_connectivity()`,成功后输出数据库名和“准备完成”。
字典取值写法是 `config["uri"]`,认证信息仍然是二元组。
第一项通常是 Cypher 字符串,描述要对图数据库做什么。
把变量值放进字典,Cypher 中用 `$变量名` 接收,避免字符串拼接。
指定目标数据库。大量查询时显式指定数据库更清晰,也减少额外判断。
records 是结果行,summary 是执行摘要,keys 是字段名。lesson_tag 的节点,避免误删已有数据。把清理对象换成岗位实践数据,标记改为 `job_practice_01`。
函数名改成 `reset_job_data(driver, tag)`,内部仍然使用 `MATCH ... DETACH DELETE`。
不要写 `MATCH (n) DETACH DELETE n`,课堂环境里也要养成安全习惯。
直接创建新节点或关系。适合确定不会重复的数据,但课堂中较少单独使用。
先匹配,找不到再创建。适合学生、课程、技能这类有唯一标识的数据。
设置或更新属性。常和 `MERGE` 配合使用,保证重复执行也能得到一致结果。
MERGE + SET,这样重复运行代码时不容易制造一堆重复节点。把 `Student`、`Course`、`Skill` 换成 `Company`、`Job`、`Skill`。
企业 `PUBLISHES` 岗位,岗位 `REQUIRES` 技能。
企业名用“星河数据服务”,岗位用“数据标注工程师”,技能用“数据清洗”。
描述要匹配的图模式。可以查节点,也可以沿着关系查路径。
补充过滤条件,例如只查某个学生、某类技能、某个课堂标记。
指定返回字段。只返回课堂需要展示的字段,不要把完整节点全搬回来。
ORDER BY 排序,LIMIT 控制返回数量。record.data() 会把一行结果转成 Python 字典,后面做表格或接口返回更方便。查询“数据标注工程师”岗位需要的技能,返回岗位名、技能名、技能类别。
沿用 `MATCH (j:Job)-[:REQUIRES]->(sk:Skill)` 的路径结构。
必须带 `lesson_tag` 过滤,并使用 `LIMIT 10` 控制结果数量。
给节点或关系新增、覆盖属性。比如修改课程学时、技能等级、岗位状态。
可以给节点补充标签,例如把重点课程标记为 `KeyCourse`。
移除某个属性或标签。课堂中先少用,重点理解修改属性。
MATCH 精准定位,再 SET 目标字段。把“数据标注工程师”岗位的 `status` 设置为 `招聘中`,把 `salary_range` 设置为 `4K-6K`。
使用 `MATCH (j:Job {title: $title})` 定位,再用 `SET` 修改属性。
返回岗位名、状态、薪资范围,并打印 `summary.counters.properties_set`。
如果只想取消连接,先匹配关系变量,再删除关系。
节点没有关系时才能直接删除。适合清理孤立测试节点。
连同节点上的关系一起删除。课堂中只对带标记的数据使用。
lesson_tag 加保护。删除“数据标注工程师”到“数据清洗”的 `REQUIRES` 关系。
必须要求关系上有 `lesson_tag = job_practice_01`。
打印 `summary.counters.relationships_deleted`,确认只删除一条或少量测试关系。
创建一次数据库工作窗口,推荐写上 `database=DATABASE`。
接收一个事务函数。驱动会在合适情况下处理重试和提交。
事务函数内部用 `tx.run()` 执行 Cypher,并在函数里处理结果。
写 `attach_required_skill(tx, job_title, skill_name, tag)`,把岗位和技能连起来。
用 `session.execute_write()` 调用事务函数,不直接在外面拼接 Cypher。
返回岗位名和技能名,确认关系已经创建或复用。
查询结果行列表。每个 `record` 可以用字段名取值,也可以转成字典。
执行摘要,包含计数器和耗时。写操作后经常看 counters。
返回字段名列表。适合调试,也适合做简单表格输出。
数据库没启动、端口不通、URI 写错,通常在连接或首次查询时暴露。
用户名、密码、权限错误。提示学生先检查密码,再检查数据库名。
标签、属性、参数名拼错。错误信息里常能看到出问题的位置。
每次查询写 `database_=DATABASE` 或 `session(database=DATABASE)`。
查询展示数据时加 `LIMIT`,不要一次把整张图搬到 Python。
外部输入放进 `parameters_`,不要把用户输入直接拼到 Cypher 字符串里。
main(),方便复现和检查。企业:云帆科技;岗位:初级数据分析助理;技能:Python 清洗、可视化表达。
连接检查、安全清理、新增节点、新增关系、查询岗位技能、修改岗位状态。
用事务一次性维护岗位和技能关系,并打印 `summary` 或返回字典结果。
先确认 Neo4j 服务已启动,再检查 URI、端口 7687、用户名和密码。
检查标签名、属性名、参数名是否一致,尤其是 `$sid` 与 `parameters_` 里的键。
新增实体时优先用 `MERGE`,并选择稳定的唯一字段,例如学号、课程编号、岗位标题。
能用 Python Driver 创建入口,并检查 Neo4j 是否可用。
能用 Python 调用 Cypher 完成增、查、改、删的核心流程。
知道用参数、课堂标记、事务和异常处理降低操作风险。