【知识图谱】3、Python操作图数据库neo4j示例

news/2024/9/20 1:29:12/ 标签: 知识图谱, python, 数据库

今天突然想起上次知识图谱系列埋了一个坑(【知识图谱】1、Neo4j环境搭建入门指南:从零开始玩转图数据库),说后续写一篇关于Python操作neo4j的示例。趁着周六有充足时间,这里写个demo补上。

本文demo还是以面试的求职者、岗位要求技能 为例。建2个实例对象

1、求职者具备的技能

2、岗位要求的技能

本文默认已经安装好 neo4j desktop数据库,直接先上代码

python">from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel
from langchain_community.graphs import Neo4jGraphimport asyncio
from typing import List
import json# Initialize FastAPI
app = FastAPI()# Initialize Neo4j with timeout
try:graph = Neo4jGraph(url="bolt://localhost:7687",username="neo4j",password="password",database="neo4j",timeout=60  # 60 seconds timeout)
except Exception as e:print(f"Failed to connect to Neo4j: {e}")graph = None# Fallback in-memory storage
job_seekers = []
job_positions = []# Define Pydantic models for request bodies
class JobSeekerModel(BaseModel):name: strskills: List[str]class JobPositionModel(BaseModel):title: strrequired_skills: List[str]# Add job seeker
@app.post("/add_job_seeker")
async def add_job_seeker(request: Request):try:# Parse JSON data from request bodydata = await request.json()print(data)job_seeker = JobSeekerModel(**data)except json.JSONDecodeError:raise HTTPException(status_code=400, detail="Invalid JSON data")except ValueError as e:raise HTTPException(status_code=400, detail=str(e))if graph:try:query = ("CREATE (j:JobSeeker {name: $name}) ""WITH j ""UNWIND $skills AS skill ""MERGE (s:Skill {name: skill}) ""CREATE (j)-[:HAS_SKILL]->(s)")await asyncio.wait_for(asyncio.to_thread(graph.query, query, {"name": job_seeker.name, "skills": job_seeker.skills}),timeout=5.0  # 5 seconds timeout)except asyncio.TimeoutError:raise HTTPException(status_code=504, detail="Database operation timed out")except Exception as e:print(f"Neo4j error: {e}")raise HTTPException(status_code=500, detail="Failed to add job seeker to Neo4j")# Always add to in-memory storage as fallbackjob_seekers.append({"name": job_seeker.name, "skills": job_seeker.skills})return {"message": f"Added job seeker {job_seeker.name} with skills {', '.join(job_seeker.skills)}"}# Add job position
@app.post("/add_job_position")
async def add_job_position(request: Request):try:# Parse JSON data from request bodydata = await request.json()print(data)job_position = JobPositionModel(**data)except json.JSONDecodeError:raise HTTPException(status_code=400, detail="Invalid JSON data")except ValueError as e:raise HTTPException(status_code=400, detail=str(e))if graph:try:query = ("CREATE (j:JobPosition {title: $title}) ""WITH j ""UNWIND $required_skills AS skill ""MERGE (s:Skill {name: skill}) ""CREATE (j)-[:REQUIRES_SKILL]->(s)")await asyncio.wait_for(asyncio.to_thread(graph.query, query,{"title": job_position.title, "required_skills": job_position.required_skills}),timeout=5.0  # 5 seconds timeout)except asyncio.TimeoutError:raise HTTPException(status_code=504, detail="Database operation timed out")except Exception as e:print(f"Neo4j error: {e}")raise HTTPException(status_code=500, detail="Failed to add job position to Neo4j")# Always add to in-memory storage as fallbackjob_positions.append({"title": job_position.title, "required_skills": job_position.required_skills})return {"message": f"Added job position {job_position.title} requiring skills {', '.join(job_position.required_skills)}"}# Run the app
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8001)

还是用AI解释下代码主要功能:

1、初始化FastAPI应用和Neo4j图数据库连接。

2、定义了两个Pydantic模型JobSeekerModel和JobPositionModel用于请求体验证。

3、提供两个POST接口:

/add_job_seeker:添加求职者信息到Neo4j(若连接成功)。

/add_job_position:添加职位信息到Neo4j(若连接成功)。

4、使用异步处理数据库操作,并设置超时时间以确保服务稳定性。

直接运行可能会提示APOC插件未安装,那就先安装plugins, APOC 点击install安装。我这个是安装的截图,当时忘记先截图了。

图片

写接口测试下可以用curl命令

1、添加求职者

curl -X POST http://localhost:8000/api/add_job_seeker
-H “Content-Type: application/json”
-d ‘{“name”: “Alice Smith”, “skills”: [“Python”, “JavaScript”, “Machine Learning”]}’
2、添加职位:

curl -X POST http://localhost:8000/api/add_job_position
-H “Content-Type: application/json”
-d ‘{“title”: “Senior Software Engineer”, “required_skills”: [“Python”, “Docker”, “Kubernetes”]}’

我们也可以用postman等工具测试

在这里插入图片描述

运行结果,由于我执行过,数据看着比较混乱

在这里插入图片描述

计划下一篇更新 neo4j图数据库结合大模型应用的例子

原文链接:【知识图谱】3、Python操作neo4j示例


http://www.ppmy.cn/news/1521057.html

相关文章

基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM 4.2 MPPT 4.3 PI 控制器原理 5.完整工程文件 1.课题概述 基于爬山法最大功率点跟踪 (Maximum Power Point Tracking, MPPT) 和比例积分控制器 (Proportional Integral, PI) 的直驱式永磁同步…

【golang】使用container/heap官方包实现一个优先队列

golang实现优先队列,以前写的一个简单例子,现上传备份 package testimport ("container/heap""fmt" )func Test() {// 测试一下任务队列// 1、首先测试是标准任务队列,队列之中的元素是结构体Personpq : &AgePQ{}heap.Init(pq)a…

论文速读|BiGym:一款基于演示的移动双手操作机器人基准

项目地址:BiGym: A Demo-Driven Mobile Bi-Manual Manipulation Benchmark BiGym 是一个针对移动双手操作的机器人学习基准,包含 40 个在家庭环境中进行的任务,如简单的目标接近到复杂的厨房清洁。这些任务涵盖了从固定的目标接近到需要与各种…

SprinBoot+Vue新生报到微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

SpringBoot中使用Redis-Lettuce

SpringBoot中使用Redis-Lettuce 配置pom在application.properties配置Redis参数协议参数设置序列化参数设置实现工具Redis操作工具类单条数据测试批量测试 在SpringBoot中一般直接引用spring-boot-starter-data-redis这个starter来使用Redis,其中具体实现方式有两种…

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

聊聊Redis分布式锁的八大坑

前言 在分布式系统中,由于redis分布式锁相对于更简单和高效,成为了分布式锁的首先,被我们用到了很多实际业务场景当中。 但不是说用了redis分布式锁,就可以高枕无忧了,如果没有用好或者用对,也会引来一些…

matlab二维热传导显示有限差分法计算(代码)

% 参数设置 x00; % x起点y00; % y起点Lx 1; % x方向长度 Ly 1; % y方向长度 Nx 100; % x方向网格数 Ny 100; % y方向网格数 dx (Lx-x0) / Nx; % x方向步长 dy (Ly-y0) / Ny; % y方向步长 alpha 0.01; % 热扩散率 dt 0.01; % 时间步长 T 1; % 总时间 nt …

Samba服务

samba 服务 一、简介 Samba 是一种在 Linux 和 Unix 系统上实现 SMB(Server Message Block)协议的服务,其目的是提供文件和打印服务。它可以让 Windows、Linux 和 Unix 之间实现文件和打印机的共享,并且支持通过 SMB/CIFS 协议进…

海外媒体发稿:排名靠前的Vents杂志网站发布新闻通稿-大舍传媒

海外媒体发稿:排名靠前的Vents杂志网站发布新闻通稿 近日,知名海外媒体Vents杂志网站发布了最新一期新闻通稿,涵盖了音乐、娱乐、新闻等多个领域的热点事件。作为一家自2009年成立以来便致力于为全球读者提供第一手资讯的在线媒体&#xff0…

深入解析Spring Boot中的`@Transactional`注解

一、Transactional注解概述 1.1 什么是Transactional Transactional是Spring框架中用于声明式事务管理的注解。通过在方法或类上添加Transactional注解,Spring会自动将该方法或类中的数据库操作纳入到事务管理中,从而保证这些操作的原子性、一致性、隔…

ES6中try-catch

在ES6(ECMAScript 2015)中,try-catch 语句的语法和使用方式与在之前的ECMAScript版本中是一样的。try-catch 语句用于处理代码中可能发生的错误,确保程序的健壮性和用户体验。 基本语法 try { // 尝试执行的代码块 // 如果发生…

Chrome 浏览器插件获取网页 window 对象(方案二)

前言 最近有个需求,是在浏览器插件中获取 window 对象下的某个数据,当时觉得很简单,和 document 一样,直接通过嵌入 content_scripts 直接获取,然后使用 sendMessage 发送数据到插件就行了,结果发现不是这…

TCP如何关闭连接(详细版)

关闭连接的⽅式通常有两种,分别是 RST 报⽂关闭和 FIN 报⽂关闭。 如果进程异常退出了,内核就会发送 RST 报⽂来关闭,它可以不⾛四次挥⼿流程,是⼀个暴⼒关闭连接的⽅式。 安全关闭连接的⽅式必须通过四次挥⼿,它…

uniap app跳转小程序

微信开放平台申请账号并认证配置APP的相关配 其中安卓的包名可以通过反编译工具查看链接 https://download.csdn.net/download/u010843503/88725345d打开后 其中md5就是签名,复制后把中间空格取消就行。 微信开放平台绑定小程序 绑定后查看微信小程序的原始id也…

win11+vscode+Flutter 开发环境配置

https://blog.csdn.net/Oven_maizi/article/details/126804404 1 vscode插件 安装 安装红框中的两个 2 flutter sdk 安装 dart sdk 包含在flutter sdk 里面,路径:flutter_windows_3.24.1-stable\flutter\bin\cache\dart-sdk 方式1: 通过…

CSS中表示长度的单位有哪些?有什么区别?

CSS中有px、em和rem三个长度单位。px是固定像素,不随页面大小变化;em和rem是相对长度单位,em相对于父元素,rem相对于根元素(html)。 在响应式布局中,rem更常用,因为它只有一个参照物…

Ansible与Docker集成:实现容器化运维自动化

Ansible与Docker集成:实现容器化运维自动化 在现代 DevOps 和云原生环境中,Ansible 和 Docker 是两种非常受欢迎的工具。Ansible 专注于配置管理和任务自动化,而 Docker 则通过容器化技术实现应用的轻量级隔离和部署。将 Ansible 和 Docker …

基于udp的socket网络编程

套接字 网络套接字 原始套接字 unix套接字 windows下SOCKET 为整数。 协议家族 套接字种类 协议 udpServer.cc #pragma warning(disable:4996) #include<iostream> #include<string> #include<cstdlib> #include<WinSock2.h>#pragma comment(li…

mac电脑里面的 磁盘分区,容器,宗卷,宗卷组的理解和使用

在mac电脑里面我们一般都是使用宗卷&#xff0c;他和我们常见的pc机器硬盘的分区是有区别的。 对于物理硬盘来说 不管是分区还是宗卷&#xff0c;他们都是逻辑上面的概念。 分区 mac电脑里面的分区 和 pc电脑中的分区差不多&#xff0c; 他们都是针对的物理硬盘&#xff0c;…