本地大模型编程实战(29)查询图数据库NEO4J(2)
上一篇文章 用大语言模型LLM查询图数据库NEO4J(1) 介绍了使用
GraphQACypherChain
查询NEO4J
。用它实现简单快捷,但是不容易定制,在生产环境中可能会面临挑战。
本文将基于langgraph
框架,用LLM(大语言模型)
查询图数据库NEO4J
。它可以定义清晰复杂的工作流,能应对比较复杂的应用场景。
以下是即将实现的可视化LangGraph
流程:
文章目录
- 定义状态
- 第一个节点:护栏/guardrails
- 节点:生成Cypher/generate_cypher(查询NEO4J的语句)
- 使用少量例子增强提示词
- 用提示词推理Cypher
- 节点:执行Cypher查询
- 生成最终回答
- 构建工作流
- 见证效果
- 总结
- 代码
- 参考
定义状态
我们将首先定义 LangGraph 应用程序的输入、输出和整体状态。
我们可以认为所谓的状态是:节点之间数据交换的数据格式。它们都继承自TypedDict
。
from operator import add
from typing import Annotated, List
from typing_extensions import TypedDictclass InputState(TypedDict):"""输入"""question: strclass OverallState(TypedDict):"""整体"""question: strnext_action: strcypher_statement: strcypher_errors: List[str]database_records: List[dict]steps: Annotated[List[str], add]class OutputState(TypedDict):"""输出"""answer: strsteps: List[str]cypher_statement: str
第一个节点:护栏/guardrails
第一个节点 guardrails 是一个简单的“护栏”步骤:我们会验证问题是否与电影或其演员阵容相关,如果不是,我们会通知用户我们无法回答任何其他问题。否则,我们将进入 Cypher
生成节点。
from typing import Literalfrom langchain_core.prompts import ChatPromptTemplate
from pydantic import BaseModel, Fieldguardrails_system = """
As an intelligent assistant, your primary objective is to decide whether a given question is related to movies or not.
If the question is related to movies, output "movie". Otherwise, output "end".
To make this decision, assess the content of the question and determine if it refers to any movie, actor, director, film industry,
or related topics. Provide only the specified output: "movie" or "end".
"""
guardrails_prompt = ChatPromptTemplate.from_messages([("system",guardrails_system,),("human",("{question}"),),]
)class GuardrailsOutput(BaseModel):decision: Literal["movie", "end"] = Field(description="Decision on whether the question is related to movies")from langchain_ollama import ChatOllama
llm_llama = ChatOllama(model="llama3.1",temperature=0, verbose=True)guardrails_chain = guardrails_prompt | llm_llama.with_structured_output(GuardrailsOutput)def guardrails(state: InputState) -> OverallState:"""Decides if the question is related to movies or not."""guardrails_output = guardrails_chain.invoke({"question": state.get("question")})database_records = Noneif guardrails_output.decision == "end":database_records = "This questions is not about movies or their cast. Therefore I cannot answer this question."return {"next_action": guardrails_output.decision,"database_records": database_records,"steps": ["guardrail"],}
该节点使用llama3.1
,通过提示词判断输出的内容是否与电影有关:如果有关则返回movie
,在后面会生成Cypher并查询图数据库NEO4J,如果无关则返回end
,交给大语言模型处理。
节点:生成Cypher/generate_cypher(查询NEO4J的语句)
使用少量例子增强提示词
将自然语言转换为准确的 Cypher
查询极具挑战性。增强此过程的一种方法是提供相关的少样本示例来指导 LLM
生成查询。为此,我们将使用 Semantic SimilarityExampleSelector
来动态选择最相关的示例。
# Few-shot prompting
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_neo4j import Neo4jVectorexamples = [{"question": "How many artists are there?","query": "MATCH (a:Person)-[:ACTED_IN]->(:Movie) RETURN count(DISTINCT a)",},{"question": "Which actors played in the movie Casino?","query": "MATCH (m:Movie {title: 'Casino'})<-[:ACTED_IN]-(a) RETURN a.name",},{"question": "How many movies has Tom Hanks acted in?","query": "MATCH (a:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(m:Movie) RETURN count(m)",},{"question": "List all the genres of the movie Schindler's List","query": "MATCH (m:Movie {title: 'Schindler's List'})-[:IN_GENRE]->(g:Genre) RETURN g.name",},{"question": "Which actors have worked in movies from both the comedy and action genres?","query": "MATCH (a:Person)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g1:Genre), (a)-[:ACTED_IN]->(:Movie)-[:IN_GENRE]->(g2:Genre) WHERE g1.name = 'Comedy' AND g2.name = 'Action' RETURN DISTINCT a.name",},{"question": "Which directors have made movies with at least three different actors named 'John'?","query": "MATCH (d:Person)-[:DIRECTED]->(m:Movie)<-[:ACTED_IN]-(a:Person) WHERE a.name STARTS WITH 'John' WITH d, COUNT(DISTINCT a) AS JohnsCount WHERE JohnsCount >= 3 RETURN d.name",},{"question": "Identify movies where directors also played a role in the film.","query": "MATCH (p:Person)-[:DIRECTED]->(m:Movie), (p)-[:ACTED_IN]->(m) RETURN m.title, p.name",},{"question": "Find the actor with the highest number of movies in the database.","query": "MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, COUNT(m) AS movieCount ORDER BY movieCount DESC LIMIT 1",},
]from langchain_ollama import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")example_selector = SemanticSimilarityExampleSelector.from_examples(examples, embeddings, Neo4jVector, k=5, input_keys=["question"]
)
用提示词推理Cypher
我们马上要实现 Cypher
生成链。提示词包含图数据的结构、动态选择的少样本示例以及用户的问题。这种组合能够生成 Cypher
查询,以从图数据库中检索相关信息。
import osdef create_enhanced_graph():"""创建NEO4J对象"""os.environ["NEO4J_URI"] = "bolt://localhost:7687"os.environ["NEO4J_USERNAME"] = "neo4j"os.environ["NEO4J_PASSWORD"] = "neo4j"from langchain_neo4j import Neo4jGraphenhanced_graph = Neo4jGraph(enhanced_schema=True)#print(enhanced_graph.schema)return enhanced_graph
enhanced_graph = create_enhanced_graph()from langchain_core.output_parsers import StrOutputParsertext2cypher_prompt = ChatPromptTemplate.from_messages([("system",("Given an input question, convert it to a Cypher query. No pre-amble.""Do not wrap the response in any backticks or anything else. Respond with a Cypher statement only!"),),("human",("""You are a Neo4j expert. Given an input question, create a syntactically correct Cypher query to run.
Do not wrap the response in any backticks or anything else. Respond with a Cypher statement only!
Here is the schema information
{schema}Below are a number of examples of questions and their corresponding Cypher queries.{fewshot_examples}User input: {question}
Cypher query:"""),),]
)llm_qwen = ChatOllama(model="qwen2.5",temperature=0, verbose=True)text2cypher_chain = text2cypher_prompt | llm_qwen | StrOutputParser()def generate_cypher(state: OverallState) -> OverallState:"""Generates a cypher statement based on the provided schema and user input"""NL = "\n"fewshot_examples = (NL * 2).join([f"Question: {el['question']}{NL}Cypher:{el['query']}"for el in example_selector.select_examples({"question": state.get("question")})])generated_cypher = text2cypher_chain.invoke({"question": state.get("question"),"fewshot_examples": fewshot_examples,"schema": enhanced_graph.schema,})return {"cypher_statement": generated_cypher, "steps": ["generate_cypher"]}
节点:执行Cypher查询
现在我们添加一个节点来执行生成的 Cypher
语句。如果图数据库没有返回结果,我们应该明确告知 LLM
,因为留空上下文有时会导致 LLM
幻觉。
可以在此节点前增加
校验查询
、更正查询
等节点提升结果的准确性。当然,增加这样的节点也不一定能达到预期效果,因为它们本身也可能出错,所以要小心对待。
no_results = "I couldn't find any relevant information in the database"def execute_cypher(state: OverallState) -> OverallState:"""Executes the given Cypher statement."""records = enhanced_graph.query(state.get("cypher_statement"))return {"database_records": records if records else no_results,"next_action": "end","steps": ["execute_cypher"],}
生成最终回答
最后一步是生成答案。这需要将初始问题与图数据库输出相结合,以生成相关的答案。
generate_final_prompt = ChatPromptTemplate.from_messages([("system","You are a helpful assistant",),("human",("""Use the following results retrieved from a database to provide
a succinct, definitive answer to the user's question.Respond as if you are answering the question directly.Results: {results}
Question: {question}"""),),]
)generate_final_chain = generate_final_prompt | llm_llama | StrOutputParser()def generate_final_answer(state: OverallState) -> OutputState:"""Decides if the question is related to movies."""final_answer = generate_final_chain.invoke({"question": state.get("question"), "results": state.get("database_records")})return {"answer": final_answer, "steps": ["generate_final_answer"]}
构建工作流
我们将实现 LangGraph
工作流。
先定义条件边函数:
def guardrails_condition(state: OverallState,
) -> Literal["generate_cypher", "generate_final_answer"]:if state.get("next_action") == "end":return "generate_final_answer"elif state.get("next_action") == "movie":return "generate_cypher"
这个函数将添加到 护栏/guardrails
后面,根据上一步是否生成了Cypher查询来决定路由到下面哪个节点去。
下面的代码将把以上的节点和边连接起来,成为一个完整的工作流:
from langgraph.graph import END, START, StateGraphlanggraph = StateGraph(OverallState, input=InputState, output=OutputState)
langgraph.add_node(guardrails)
langgraph.add_node(generate_cypher)
langgraph.add_node(execute_cypher)
langgraph.add_node(generate_final_answer)langgraph.add_edge(START, "guardrails")
langgraph.add_conditional_edges("guardrails",guardrails_condition,
)langgraph.add_edge("generate_cypher","execute_cypher")
langgraph.add_edge("execute_cypher","generate_final_answer")langgraph.add_edge("generate_final_answer", END)langgraph = langgraph.compile()
见证效果
万事俱备,我们给构建好的langgraph
工作流提两个问题,看看它的表现吧:
def ask(question:str):response = langgraph.invoke({"question": question})print(f'response:\n{response["answer"]}')ask("What's the weather in Spain?")
ask("What was the cast of the Casino?")
第一个问题与电影无关,没有查询NEO4J
,问题直接由LLM
做了回答:
I'm happy to help with that! Unfortunately, I don't have access to real-time weather information for specific locations like Spain. However, I can suggest checking a reliable weather website or app, such as AccuWeather or Weather.com, for the most up-to-date forecast.Would you like me to provide some general information about Spain's climate instead?
对于第二个问题,执行时间较长,最后给出的回答是:
The cast of the movie "Casino" included James Woods, Joe Pesci, Robert De Niro, and Sharon Stone.
Nice!
总结
本文演示了通过比较复杂的langgraph
构建了图形化的工作流,由它来处理对图数据的查询。
我觉得使用这种方式的弊端是比较麻烦,好处则是思路很清晰、容易定制修改,更加适合在生产环境中构建比较复杂的AI应用或者智能体Agent。
代码
本文涉及的所有代码以及相关资源都已经共享,参见:
- github
- gitee
为便于找到代码,程序文件名称最前面的编号与本系列文章的文档编号相同。
参考
- Build a Question Answering application over a Graph Database
🪐感谢您观看,祝好运🪐
相关文章:
本地大模型编程实战(29)查询图数据库NEO4J(2)
上一篇文章 用大语言模型LLM查询图数据库NEO4J(1) 介绍了使用GraphQACypherChain查询NEO4J。用它实现简单快捷,但是不容易定制,在生产环境中可能会面临挑战。 本文将基于langgraph 框架,用LLM(大语言模型)查询图数据库NEO4J。它可以定义清晰复…...
Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南
目录 一、为什么需要文档型数据库?1.1 数据存储的范式变革1.2 pymongo的核心优势 二、pymongo核心操作全解析2.1 环境准备2.2 数据库连接与CRUD操作2.3 聚合管道实战2.4 分批次插入百万级数据(进阶)2.5 分批次插入百万级数据(进阶…...
从遍历序列构造二叉树:前序+中序与中序+后序的递归解法详解
文章目录 1. 问题背景2. 核心思路3. 从前序与中序遍历序列构造二叉树3.1 递归分治思路3.2 代码实现与注释 4. 从中序与后序遍历序列构造二叉树4.1 递归分治思路4.2 代码实现与注释 5. 复杂度分析6. 总结 1. 问题背景 二叉树的遍历方式包括前序(根-左-右)…...
数据挖掘专栏介绍:用 Python + 大语言模型 (LLM) 重塑电商数据价值
写在前面 —— 不止于挖掘,更要智能涌现:用 Python + 大语言模型 (LLM) 重塑电商数据价值 或许你已经跟随我们之前的 “零基础上手Python数据分析” 专栏,掌握了 Pandas 的数据操纵、Matplotlib/Seaborn 的可视化呈现,甚至对传统的数据挖掘技术如聚类、分类、回归有了初步…...
CSS Transition入门指南
CSS Transition 完全指南 目录 Transition 的作用核心属性代码示例使用场景性能优化常见问题思维导图 1. Transition 的作用 CSS Transition 用于在 属性值变化时 创建平滑的过渡效果。例如: 鼠标悬停时按钮放大元素颜色渐变切换位置移动的缓动效果 2. 核心属性…...
Nginx 核心功能
目录 一、基于授权的访问控制 (1)使用htpasswd 生成用户认证文件 (2)修改密码文件权限为400,将所有者改为nginx ,设置 Nginx 的运行用户能够读取 (3)修改主配置文件 nginx.conf&…...
排序版研究方向
姓 名研究方向电子邮箱办公电话办公地点曹培根代数cao2024ustc.edu.cn 新楼412陈洪佳代数hjchenustc.edu.cn0551-636076931529陈小伍代数xwchenmail.ustc.edu.cn0551-636062351321梁永祺代数yqliangustc.edu.cn0551-636006171613欧阳毅代数yiouyangustc.edu.cn0551-63600337…...
AI国学智慧语录视频,条条视频10W+播放量
家人们!图书类带货玩法真的非常多,之前也分享过蛮多,例如情感语录、育儿教育、爆款图书金句类、AI历史人物解说类等等。 本期继续来分享一个对于普通人来说,上手相当简单,容易起号,可作为长线深耕的AI带货…...
RN 获取视频封面,获取视频第一帧
严格的说,没有解决这个问题,实际上是绕过了这个问题,严格的说获取的也不是第一帧。 RN的video 视频应用,大多是这样的 1、安装 yarn add react-native-video 2、导入 import Video from react-native-video; 3、使用 …...
缓存分片哈希 vs 一致性哈希:优缺点、区别对比及适用场景(图示版)
📜 引言 在分布式缓存系统中,数据分布策略是设计的关键之一。缓存分片哈希和一致性哈希是两种常见的数据分布算法,它们各有优缺点和适用场景。本文将通过图示对比表格,深入解析这两种算法的核心原理、优缺点及适用场景。 &#x…...
iOS - 音频: Core Audio - 播放
环境 iOS 18 Xcode 16.3 swift-driver version: 1.120.5 Apple Swift version 6.1 (swiftlang-6.1.0.110.21 clang-1700.0.13.3) Target: x86_64-apple-macosx15.0 Core Audio 的架构 声音数据的描述 sample: 一个声道采样的值,采样率定义了每秒从连续信号中提取并组成离散信号…...
Nerfstudio 环境配置与自有数据集(图片和视频)测试全方位全流程实战【2025最新版!!】
一、引言 神经辐射场(Neural Radiance Fields,简称NeRF)是近年来计算机视觉和图形学领域的一项革命性技术,它能够从2D图像中学习复杂的3D场景表示。然而,NeRF技术的实现和应用门槛较高,需要较为专业的计算机视觉和深度学习知识。…...
【Java学习】动态代理有哪些形式?
Java动态代理的两种主要形式 动态代理在Java中有两种主要的实现方式,它们各有特点和使用场景: 1. JDK动态代理 (基于接口) 特点: Java标准库自带的功能(java.lang.reflect.Proxy)只能代理接口,不能代理…...
Android Studio 中实现方法和参数显示一行
Android Studio 中实现方法和参数显示一行,可通过以下步骤配置: 一、基础格式化设置 快捷键格式化 选中代码后使用 Ctrl Alt L(Windows/Linux)或 Cmd Option L(Mac)进行快速格式化27。 菜单操作…...
SQLyog中DELIMITER执行存储过程时出现的前置缩进问题
在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为。以下是详细解释和解决方案: 问题根源 SQLyog的语句分隔逻辑: SQLyog默认会根据分号(;)和换行自动分隔SQL语句 当代码有缩进时,SQLy…...
基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表
要实现基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表,首先需要对ShardingSphere进行一些基本配置。你提到的溯源码、批次号等数据需要考虑到跨年数据的存储,因此要设计一个能够动态扩展的分表策略 添加ShardingSphere依赖 在…...
vscode chrome调试怎么在所有浏览器都好使
chrome调试时只能在打开的浏览器里进行调试,其它打开的chrome浏览器就不能调试了,怎么解决。 右键点击 Chrome 的快捷方式图标,选择属性 在目标一栏,最后加上--remote-debugging-port9222 注意要用空格隔开 lanch.json 文件配置 …...
20250429在Ubuntu 20.04.6下安装VMware Workstation16
20250429在Ubuntu 20.04.6下安装VMware Workstation16 2025/4/29 20:16 缘起:1、在ubuntu14.04下git clone异常该如何处理呢? 2、请问 现在 编译NanoPi NEO的FriendlyCore系统使用ubuntu哪一个版本比较好? ubuntu14.04 编译异常/下载不了&am…...
Java高频面试之并发编程-10
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:ThreadLocalMap 怎么解决 Hash 冲突的? ThreadLocalMap 是 ThreadLocal 的核心实现,它采用 开放…...
【Tauri2】035——sql和sqlx
前言 这篇就来看看插件sql SQL | Taurihttps://tauri.app/plugin/sql/ 正文 准备 添加依赖 tauri-plugin-sql {version "2.2.0",features ["sqlite"]} features可以是mysql、sqlite、postsql 进去features看看 sqlite ["sqlx/sqlite&quo…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 16)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 […...
VScode与远端服务器SSH链接
这里写自定义目录标题 简介步骤 简介 这里是使用密钥文件链接 步骤 首先在windows CMD中运行 ssh-keygen -t rsa,生成本机的公钥和私钥 这里id rsa.pub就是公钥,在服务器端使用,id rsa是私钥在用户端使用;通常目录在C:/Users/Your name/…...
数据结构入门:详解顺序表的实现与操作
目录 1.线性表 2.顺序表 2.1概念与结构 2.2分类 2.2.1静态顺序表 2.2.2动态顺序表 3.动态顺序表的实现 3.1.SeqList.h 3.2.SeqList.c 3.2.1初始化 3.2.2销毁 3.2.3打印 3.2.4顺序表扩容 3.2.5尾部插入及尾部删除 3.2.6头部插入及头部删除 3.2.7特定位置插入…...
Reactor框架介绍
Reactor(反应器模式)是一种事件驱动的设计模式,广泛用于高性能网络编程和异步I/O处理。它的核心思想是将事件分发与业务逻辑解耦,通过统一的机制处理多路I/O事件。 这个在android蓝牙中大量使用,如果这里不懂,那么很难看懂底层的逻辑,所以我们在这片文章中做一个介绍 …...
Nacos 3.0 正式发布:MCP Registry、安全零信任、链接更多生态
Nacos 3.0 正式版本发布啦!升级 MCP Registry,围绕着 MCP 服务管理,MCP 多种类型注册,包含 MCP Server 注册、编排、动态调试和管理,并且提供 Nacos-MCP-Router 可以进行 MCP 动态发现,可以自动安装、代理 …...
前端安全中的XSS(跨站脚本攻击)
XSS 类型 存储型 XSS 特征:恶意脚本存储在服务器(如数据库),用户访问受感染页面时触发。场景:用户评论、论坛帖子等持久化内容。影响范围:所有访问该页面的用户。 反射型 XSS 特征:恶意脚本通过…...
go单向链表
需求 实现单向链表的节点顺序添加、顺序遍历。 实现 package mainimport ("fmt" )type zodiac_sign struct {number intdizhi stringanimal stringyear intnext *zodiac_sign }// 添加 // func add_node_by_order(previous_node zodiac_sign, current_node z…...
Python小程序:上班该做点摸鱼的事情
系统提醒 上班会忘记一些自己的事,所以你需要在上班的的时候突然给你弹窗,你就知道要做啥了 源码 # -*- coding:utf-8 -*- """ 作者:杨桃清 日期: 2025年04日29 21:51:24 """ import datetime import time import thre…...
uni-app中使用RenderJs 使用原生js
RenderJs运行的层叫【视图层】,Uniapp原生Script叫【逻辑层】,逻辑层要调用视图层需要使用一个叫【watcher】,具体怎么调用呢 为了实现这两层之间的通信,uniapp提供了一些特定的机制。以下是对这些通信机制的详细解释,…...
51c自动驾驶~合集37
我自己的原文哦~ https://blog.51cto.com/whaosoft/13878933 #DETR->DETR3D->Sparse4D 走向长时序稀疏3D目标检测 一、DETR 图1 DETR架构 DETR是第一篇将Transformer应用到目标检测方向的算法。DETR是一个经典的Encoder-Decoder结构的算法,它的骨干网…...
uniapp 小程序 安卓苹果 短视频解决方案
需求 要做类似抖音小程序的功能 思路 uniapp 使用swiper滑块 实现滑动 使用video播放视频 遇到的问题 1 video组件在小程序可以使用 uni.createVideoContext api控制 2 但是在app端会有层级问题(因为使用的原生组件具体看官方文档)导致无法正常滑动…...
LeetCode58_最后一个单词的长度
LeetCode58_最后一个单词的长度 标签:#字符串Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签:#字符串 Ⅰ. 题目 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、…...
深入理解Spring AI框架的核心概念
深入理解Spring AI框架的核心概念 前言 在当今人工智能飞速发展的时代,将AI技术集成到应用程序中已成为众多开发者关注的焦点。Spring AI框架为Java开发者提供了便捷的途径来实现这一目标。理解其核心概念对于充分发挥框架的潜力至关重要。本文将详细探讨Spring A…...
技术驱动与模式创新:开源AI大模型与S2B2C商城重构零售生态
摘要:在移动互联网与人工智能技术深度融合的背景下,零售行业正经历从“人找货”到“货找人”的范式转移。本文以开源AI大模型、AI智能名片、S2B2C商城小程序源码为核心技术要素,结合无人便利店、盒马鲜生、王府井二次元业态等商业实践&#x…...
精益数据分析(30/126):电商商业模式的深度剖析与关键指标解读
精益数据分析(30/126):电商商业模式的深度剖析与关键指标解读 在创业与数据分析的漫漫征途中,我们都在不断探寻如何更好地理解和运用商业数据,以实现业务的蓬勃发展。今天,我依旧带着和大家共同进步的初心…...
玩玩OCR
一、Tesseract: 1.下载windows版: tesseract 2. 安装并记下路径,等会要填 3.保存.py文件 import pytesseract from PIL import Image def ocr_local_image(image_path):try:pytesseract.pytesseract.tesseract_cmd rD:\Programs\Tesseract-OCR\tesse…...
gradle 下载的tencent的镜像
distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-5.4.1-all.zip distributionUrlhttps://mirrors.aliyun.com/gradle/distributions/v5.4.1/gradle-5.4.1-all.zip 参考: gradle 镜像地址,解决 AS 下载缓慢或者下不下来的问题-CSDN博客...
【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统
项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…...
【Redis——数据类型和内部编码和Redis使用单线程模型的分析】
文章目录 Redis的数据类型和内部编码单线程模型的工作过程Redis虽然是一个单线程模型,为啥效率那么高,速度快呢? 总而言之,Redis提供的哈希表容器并不一定真的是真的哈希表,而是在特点的场景下,用别的容器去…...
leetcode day37 474
474 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:s…...
【计算机视觉】目标检测:深度解析YOLOv9:下一代实时目标检测架构的创新与实战
深度解析YOLOv9:下一代实时目标检测架构的创新与实战 架构演进与技术创新YOLOv9的设计哲学核心创新解析1. 可编程梯度信息(PGI)2. 广义高效层聚合网络(GELAN)3. 轻量级设计 环境配置与快速开始硬件需求建议详细安装步骤…...
Android Studio Profiler
1.我们想要查看自己方法的调用链,或者分析方法耗时的情况,可以选择Android Studio的Profiler,比较方便快捷。如下: 2.基本的面板参数讲解: 3.可以通过搜索,查看对应的方法,以及方法的调用链…...
Android Studio for Platform(ASFP)真机调试
连接设备 由于ubuntu连接adb设备每次都需要配置usb权限,很麻烦。并且每次换设备还要重新配置,我多数设备都是用wifi的adb方式连接。 开发板显示 连接显示器配合usb鼠标或者遥控器操作(因为开发板默认开启了adb,我这里是使用有线…...
如何个人HA服务器地址和长期密钥
下面分两步说明如何获取你的 Home Assistant 服务器地址以及创建“长期访问令牌”(Long-Lived Access Token),并给出一个简单的 Python 调用示例。 一、获取 Home Assistant 服务器地址 默认域名/端口 如果你在本机或局域网内安装并使用默认设…...
生物化学笔记:神经生物学概论04 视觉通路简介视网膜视网膜神经细胞大小神经节细胞(视错觉)
视觉通路简介 神经节细胞的胞体构成一明确的解剖层次,其外邻神经纤维层,内接内丛状层,该层在鼻侧厚约10~20μm,最厚在黄斑区约60~80μm。 全部细胞数约为120万个(1000000左右)。 每个细胞有一轴突ÿ…...
C++——调用OpenCV和NVIDIA Video Codec SDK库实现使用GPU硬解码MP4视频文件
系列文章目录 参考博客 参考博客 参考博客 文章目录 系列文章目录前言一、下载安装NVIDIA Video Codec SDK1、下载NVIDIA Video Codec SDK2、安装NVIDIA Video Codec SDK 二、下载编译安装OpenCV1、下载OpenCV2、编译安装OpenCV3、配置环境变量4、报错解决报错一: …...
dify升级最新版本(保留已创建内容)
dify安装参考文章: DeepSeek+Dify本地部署私有化知识库 如果之前安装的时候,是通过docker镜像的方式。 从网上下载最新的dify包,下载地址: https://github.com/langgenius/dify 下载完成后,把文件覆盖原…...
4、RabbitMQ的七种工作模式介绍
目录 一、Simple(简单模式) 1.1 概念 1.2 代码实现 消费者 运行结果 二、Work Queue(工作队列) 2.1 概念 1.2 代码实现 生产者 消费者 运行结果 三、Publish/Subscribe(发布/订阅模式) 3.1 概念 3.2 代码实现 生产者…...
React Three Fiber 详解:现代 Web3D 的利器
React Three Fiber 详解:现代 Web3D 的利器 随着 Web 技术的发展,3D 场景与交互已经不再是游戏开发者的专利。越来越多的网站、产品页、交互动画,开始大量引入 3D 元素。要在 React 项目中高效使用 WebGL,React Three Fiber(简称 R3F)成为了目前最主流的选择。 今天这篇…...
同步与互斥(同步)
线程同步 条件变量 当⼀个线程互斥地访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。 例如⼀个线程访问队列时,发现队列为空,它只能等待,只到其它线程将⼀个节点添加到队列中。这种情况就需要⽤到条…...