【實操】Noej4圖數據庫安裝和mysql表銜接實操

目錄

一、圖數據庫介紹

二、安裝Neo4j

2.1 安裝java環境

2.2?安裝 Neo4j(社區版)

2.3 修改配置

2.4 驗證測試

2.5 卸載

2.6 ?基本用法

2.7 windows連接服務器可視化

三、neo4j和mysql對比

3.1 場景對比

3.2 Mysql和neo4j的映射對比

3.3 mysql數據轉換到neo4j存儲

四、實操mysql到neo4j轉化

4.1 場景描述

4.2 neo4j數據建模設計

4.3 python代碼實現數據導入

4.4 常見錯誤及解決方法

4.5 代碼不使用apoc插件

五、參考資料


一、圖數據庫介紹

圖形數據庫(例如 Neo4j)是用于表示和處理以圖形形式存儲的數據的數據庫。圖形數據由節點??邊(?或關系)?和屬性組成。節點表示實體,關系連接實體,屬性提供有關節點和關系的附加元數據。

該圖包含三個節點 -?Patient?、?Visit?和?Payer?。?Patient?和?Visit?通過?HAS?關系連接,表示某位住院患者進行了一次就診。同樣,?Visit?和?Payer?通過?COVERED_BY?關系連接,表示某位保險支付方承擔了某次住院費用。

注意,這些關系是用箭頭表示方向的。例如,?HAS?關系的方向表示患者可以就診,但就診不能有患者。

節點和關系都可以具有屬性。在本例中,?Patient?節點具有 ID、姓名和出生日期屬性,而?COVERED_BY?關系具有服務日期和賬單金額屬性。像這樣將數據存儲在圖中有幾個優點:

簡單性?:在圖形數據庫中對實體之間的真實關系進行建模是很自然的,從而減少了需要多個連接操作來回答查詢的復雜模式的需要。

關系?:圖形數據庫擅長處理復雜的關系。遍歷關系非常高效,可以輕松查詢和分析關聯數據。

靈活性?:圖形數據庫無模式,可以輕松適應不斷變化的數據結構。這種靈活性有利于不斷發展的數據模型。

性能?:在圖形數據庫中檢索連接數據的速度比在關系數據庫中更快,特別是對于涉及具有多種關系的復雜查詢的場景。

模式匹配?:圖形數據庫支持強大的模式匹配查詢,使得表達和查找數據中的特定結構變得更加容易。

當您的數據具有許多復雜的關系時,與關系數據庫相比,圖數據庫的簡單性和靈活性使其更易于設計和查詢。正如您稍后將看到的,在圖數據庫查詢中指定關系非常簡潔,并且不需要復雜的連接操作。如果您感興趣,Neo4j 在其文檔中通過一個實際的示例數據庫很好地說明了這一點。

由于這種簡潔的數據表示,LLM 生成圖數據庫查詢時出錯的可能性更小。這是因為您只需告知 LLM 圖數據庫中的節點、關系和屬性。相比之下,關系數據庫的 LLM 必須遍歷并保留整個數據庫中的表模式和外鍵關系,這導致 SQL 生成過程中更容易出錯。

二、安裝Neo4j

需求,在ubuntu服務器安裝neo4j,windows上安裝可視化

2.1 安裝java環境

Neo4j 依賴 Java 運行環境,需先安裝 OpenJDK:

sudo apt update
sudo apt install openjdk-11-jdk
java -version ?# 驗證安裝

2.2?安裝 Neo4j(社區版)

# 下載并添加 Neo4j 官方 GPG 密鑰
wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -

# 添加 Neo4j 5.x 的倉庫源
echo 'deb https://debian.neo4j.com stable 5' | sudo tee /etc/apt/sources.list.d/neo4j.list

# 安裝 Neo4j
sudo apt update

sudo apt install neo4j

# 或者安裝特定版本

sudo apt install neo4j=1:5.26.11

# 啟動服務
sudo systemctl start neo4j

# 查看運行狀態

sudo systemctl status neo4j


sudo systemctl enable neo4j ?# 設置開機自啟

2.3 修改配置

默認配置下,Neo4j 只允許本地連接。要允許從 Windows 機器訪問,需修改其配置文件。

找到并修改以下行,確保 Neo4j 監聽所有網絡接口:

sudo nano /etc/neo4j/neo4j.conf

# 取消注釋或修改為以下內容
dbms.default_listen_address=0.0.0.0

# 分配內存

dbms.memory.heap.initial_size=1G
dbms.memory.heap.max_size=2G

重啟服務,配置信息才會生效

sudo systemctl restart neo4j? ? ? # 重啟服務
sudo systemctl enable neo4j ? ? ?# 設置開機自動啟動
sudo systemctl status neo4j ? ? ?# 檢查服務狀態

2.4 驗證測試

  • 打開?http://localhost:7474
  • 使用默認用戶名?neo4j?和初始密碼?neo4j?登錄
  • 按提示設置新密碼

2.5 卸載

# 停止 Neo4j 服務
sudo systemctl stop neo4j

# 卸載 neo4j 軟件包(保留配置文件可選)
sudo apt remove neo4j

# 如果你想徹底刪除所有配置文件和數據,可以使用 purge
sudo apt purge neo4j

2.6 ?基本用法

使用瀏覽器來進行增刪改查

CREATE (n:Person {name: 'Alice', age: 30})

CREATE (a:Person {name: 'Bob', age: 25}), (b:Person {name: 'Charlie', age: 35})

# 創建關系

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'}) CREATE (a)-[:KNOWS {since: '2024-09-03'}]->(b)

# 查詢

MATCH (n) RETURN n

MATCH (p:Person {name: 'Alice'}) RETURN p

#?查找年齡大于 25 且名字以 'A' 開頭的人

MATCH (p:Person)
WHERE p.age > 25 AND p.name STARTS WITH 'A'

RETURN p

查詢節點和關系的個數

-- 檢查是否還有任何節點存在,期望結果為 0
MATCH (n) RETURN count(n);

-- 檢查是否還有任何關系存在,期望結果為 0
MATCH ()-[r]->() RETURN count(r);

刪除所有節點信息:

-- 這將匹配并刪除所有節點及其所有關系
MATCH (n) DETACH DELETE n;

2.7 windows連接服務器可視化

訪問官網,下載windows的軟件

Thanks for Downloading Neo4j Desktop - Graph Database & Analytics

然后選擇連接,用戶名是 neoj4 ,密碼如果沒有在瀏覽器改過,就是neoj4,修改過就是修改后的密碼。

連接的協議是?neo4j://? 地址是 服務器公網IP:7687? 用戶名:neoj4 密碼初始是 neoj4

三、neo4j和mysql對比

3.1 場景對比

對比維度

Neo4j (圖數據庫)

MySQL (關系型數據庫)

??數據模型??

??圖結構??:節點(實體)、關系(連接)、屬性(鍵值對)

??表結構??:表、行、列,通過外鍵關聯

??查詢語言??

??Cypher??:聲明式語言,直觀描述圖形模式(如?MATCH (p:Person)-[:LIVES_IN]->(c:City)

??SQL??:聲明式語言,用于操作和查詢表數據(如?SELECT * FROM persons JOIN cities ON...

??核心優勢??

??處理深度關聯數據??:多跳查詢(如朋友的朋友)、路徑查找、復雜關系分析性能極高,近乎實時

??處理結構化數據??:事務處理(OLTP)、復雜報表(OLAP)、多表連接查詢,技術成熟穩定

??典型應用場景??

社交網絡、推薦系統、欺詐檢測、知識圖譜、權限管理、供應鏈分析

電商平臺、ERP系統、財務系統、內容管理系統(CMS)

??模式靈活性??

??動態模式(Schema-less)??:節點和關系的屬性可以隨時增減,無需預先定義嚴格結構

??固定模式(Schema-full)??:表結構需預先設計定義(DDL),修改成本較高

??擴展性??

支持原生圖存儲和優化,擅長垂直擴展;企業版支持因果集群實現高可用和水平讀擴展

支持主從復制、分片(Sharding)等方式進行水平和垂直擴展,方案成熟

??事務支持??

完全支持 ACID 事務

完全支持 ACID 事務

3.2 Mysql和neo4j的映射對比

MySQL (關系型數據庫)

Neo4j (圖數據庫)

說明

??表 (Table)??

??節點標簽 (Label)??

在 MySQL 中,一個表定義了一類實體的結構。在 Neo4j 中,一類實體用節點標簽表示,如?:User

??一行記錄 (Row)??

??一個節點 (Node)??

MySQL 表中的一行具體數據,對應 Neo4j 中的一個具體節點。

??列 (Column)??

??節點屬性 (Property)??

MySQL 中描述實體屬性的列,對應 Neo4j 中節點的屬性鍵值對。

??外鍵關聯 (Foreign Key)??

??關系 (Relationship)??

MySQL 中通過外鍵建立的表間關聯,在 Neo4j 中轉化為節點之間有方向、有類型的關系邊。

??關聯表 (Junction Table)??

??關系屬性 (Property)??

在處理多對多關系時,MySQL 可能需要關聯表,而 Neo4j 的關系本身可以直接擁有屬性。

??JOIN 查詢??

??關系遍歷??

MySQL 中通過 JOIN 操作關聯多表,Neo4j 通過直接遍歷節點間的關系進行查詢,效率更高。

3.3 mysql數據轉換到neo4j存儲

🔄 從 MySQL 轉換到 Neo4j 的關鍵步驟

將 MySQL 數據庫遷移到 Neo4j 通常包含以下幾個核心階段

  1. 1?數據建模(核心)??:
    • ?識別 MySQL 中的每個??表??:這些表通常會成為 Neo4j 中的??節點標簽??(Label)。例如,Users表對應?:User節點。
    • ?識別 MySQL 表中的??列??:這些列通常會成為 Neo4j 中節點的??屬性??。例如,Users表中的?name,?email列。
    • ?識別 MySQL 中的??外鍵關系??或??關聯表??:這些是轉換的關鍵。它們會成為 Neo4j 中連接節點的??關系??(Relationship)。你需要為每種關系定義一個??類型??(Type)和??方向??(Direction)。例如,FRIENDS_WITHPLACED_ORDERBELONGS_TO
  2. 2?數據遷移??:
    • ?編寫 ETL (Extract, Transform, Load) 腳本或使用數據遷移工具。
    • ?提取 (Extract)??:從 MySQL 中讀取數據。
    • ?轉換 (Transform)??:將 MySQL 的數據結構轉換為 Neo4j 的圖數據結構(按照上一步的模型)。
    • ?加載 (Load)??:將轉換后的數據導入 Neo4j。這可以通過 Neo4j 的?neo4j-admin批量導入工具實現,或者使用官方驅動(如?neo4j-python-driver)通過 Cypher 語句寫入
  3. 3?應用層調整??:
    • ?將應用程序中原先的 SQL 查詢語句??重寫為 Cypher 查詢語句??。
    • ?調整代碼中與數據庫交互的部分,使其適應 Neo4j 的查詢方式和返回結果。

比如:假設有一個簡單的 MySQL 數據庫,包含?Users表和?Orders

CREATE TABLE Users (UserID INT PRIMARY KEY,UserName VARCHAR(50)
);
CREATE TABLE Orders (OrderID INT PRIMARY KEY,UserID INT,ProductName VARCHAR(50),FOREIGN KEY (UserID) REFERENCES Users(UserID)
);

轉換為 Neo4j 的 Cypher 語句:?

// 創建 User 節點
CREATE (u:User {UserID: 123, UserName: 'Alice'});// 創建 Order 節點
CREATE (o:Order {OrderID: 456, ProductName: 'Laptop'});// 創建用戶和訂單之間的關系 (假設用戶ID123下了訂單ID456)
MATCH (u:User {UserID: 123}), (o:Order {OrderID: 456})
CREATE (u)-[:PLACED_ORDER]->(o);

四、實操mysql到neo4j轉化

4.1 場景描述

mysql數據庫中有兩張表,用于記錄用戶和大模型交互系統的數據。

一張是chat_feedback.csv,用戶反饋的表格

詳細記錄了哪個組織的哪個用戶對哪個會話的哪輪回答進行點贊還是點踩(也可能沒有點贊點踩),還有相關原因。

org_id user_id conversation_id task_id query answer is_like reasons comment created_at updated_at

還有一個表格是conversations.csv,用戶會話表格

詳細記錄了 哪個組織的哪個用戶的會話信息情況,下面是相關字段

org_id user_id conversation_id conversation_len conversation_name created_at updated_at

現在我們的目的是把上述兩張表信息存儲到neo4j中,然后進行高效的查詢下述問題:

1)?查詢某個組織(例如org_id為'XYZ')收到的所有負面反饋(is_like為0)及其原因

2)?查找用戶'user123'提交的所有反饋所在的會話及其會話名稱

3)分析某個會話(conversation_id為'conv456')中反饋的分布情況(點贊、點踩數量)

4.2 neo4j數據建模設計

節點名稱

屬性

標簽

??組織??

org_id(唯一標識)

Organization

??用戶??

user_id(唯一標識)

User

??會話??

conversation_id,?conversation_name,?conversation_len

Conversation

??反饋??

is_like,?reasons,?comment,?query,?answer

Feedback

關系名稱

方向

屬性(示例)

描述

BELONGS_TO

用戶 → 組織

-

用戶屬于某個組織

CREATED_BY

會話 → 用戶

??created_at?? (取自會話的created_at)

會話由某個用戶在特定時間創建

HAS_FEEDBACK

會話 → 反饋

-

會話包含多條反饋

SUBMMITED_BY

反饋 → 用戶

??created_at?? (取自反饋的created_at)

反饋由某個用戶在特定時間提交

ABOUT_ORGANIZATION

反饋 → 組織

-

反饋針對某個組織(可選,根據查詢需求)

4.3 python代碼實現數據導入

import pandas as pd
from neo4j import GraphDatabase# Neo4j 連接配置
NEO4J_URI = "bolt://localhost:7687"
NEO4J_USER = "neo4j"
NEO4J_PASSWORD = "your_password"  # 請替換為你的密碼# 初始化驅動
driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))def import_to_neo4j(conversations_csv_path, chat_feedback_csv_path):"""將CSV數據導入Neo4j:param conversations_csv_path: 會話CSV文件路徑:param chat_feedback_csv_path: 反饋CSV文件路徑"""# 讀取CSV文件df_conversations = pd.read_csv(conversations_csv_path)df_feedback = pd.read_csv(chat_feedback_csv_path)with driver.session() as session:# 1. 清空現有數據庫(謹慎使用!根據需求決定是否保留)# session.run("MATCH (n) DETACH DELETE n")# 2. 創建索引以提高查詢和導入性能session.run("CREATE INDEX IF NOT EXISTS FOR (o:Organization) ON (o.org_id)")session.run("CREATE INDEX IF NOT EXISTS FOR (u:User) ON (u.user_id)")session.run("CREATE INDEX IF NOT EXISTS FOR (c:Conversation) ON (c.conversation_id)")session.run("CREATE INDEX IF NOT EXISTS FOR (f:Feedback) ON (f.created_at)")# 3. 批量處理組織、用戶和會話節點及其關系# 使用apoc.periodic.iterate進行批量處理,提高大規模數據導入效率create_nodes_relationships_query = """CALL apoc.periodic.iterate('UNWIND $batch AS row RETURN row','MERGE (org:Organization {org_id: row.org_id})MERGE (user:User {user_id: row.user_id})MERGE (conv:Conversation {conversation_id: row.conversation_id})ON CREATE SET conv.conversation_name = row.conversation_name,conv.conversation_len = row.conversation_len,conv.created_at = row.created_at,conv.updated_at = row.updated_atMERGE (user)-[:BELONGS_TO]->(org)// 創建CREATED_BY關系并設置created_at屬性MERGE (conv)-[:CREATED_BY {created_at: row.created_at}]->(user)',{batchSize: 10000, parallel: false, params: {batch: $batch}})"""conversations_batch = df_conversations.to_dict('records')session.run(create_nodes_relationships_query, batch=conversations_batch)# 4. 批量處理反饋節點及其關系create_feedback_relationships_query = """CALL apoc.periodic.iterate('UNWIND $batch AS row RETURN row','MATCH (conv:Conversation {conversation_id: row.conversation_id})MATCH (user:User {user_id: row.user_id})MATCH (org:Organization {org_id: row.org_id})CREATE (feedback:Feedback {is_like: row.is_like,reasons: row.reasons,comment: row.comment,query: row.query,answer: row.answer,created_at: row.created_at,updated_at: row.updated_at})CREATE (conv)-[:HAS_FEEDBACK]->(feedback)// 創建SUBMITTED_BY關系并設置created_at屬性CREATE (feedback)-[:SUBMITTED_BY {created_at: row.created_at}]->(user)CREATE (feedback)-[:ABOUT_ORGANIZATION]->(org)',{batchSize: 10000, parallel: false, params: {batch: $batch}})"""feedback_batch = df_feedback.to_dict('records')session.run(create_feedback_relationships_query, batch=feedback_batch)print("數據導入完成!")if __name__ == "__main__":try:import_to_neo4j("conversations.csv", "chat_feedback.csv")except Exception as e:print(f"導入過程中發生錯誤: {e}")finally:driver.close()

4.4 常見錯誤及解決方法

{code: Neo.ClientError.Procedure.ProcedureNotFound} {message: There is no procedure with the name `apoc.periodic.iterate` registered for this database instance. Please ensure you've spelled the procedure name correctly and that the procedure is properly deployed.}

報錯說明neo4j服務器端沒有安裝匹配版本的apoc插件,或者沒有啟用這個插件。

查找一下插件目錄位置

sudo systemctl status neo4j

確認插件目錄/var/lib/neo4j/plugins/,再查找目錄下有沒有apoc插件

cd /var/lib/neo4j/plugins/

ls

說明沒有安裝插件

確認neo4j版本號

CALL dbms.components() YIELD name, versions
RETURN name, versions;

根據查詢得到的 Neo4j 版本號,去 ??GitHub Release?? 頁面下載對應版本的 APOC 插件。

確保你下載的 APOC 版本與你的 Neo4j 版本完全一致(例如 Neo4j 4.4.45對應 APOC 4.4.45)。

然后直接將 Jar 文件放入?plugins目錄,??不要??新建子文件夾,也??不要??解壓 Jar 包

sudo cp /path/to/your/downloaded/apoc-*.jar /var/lib/neo4j/plugins/

sudo cp /root/apoc-5.26.11-core.jar /var/lib/neo4j/plugins/

修改配置文件

sudo nano /etc/neo4j/neo4j.conf

#找到如下配置打開

dbms.security.procedures.unrestricted=apoc.*

dbms.security.procedures.allowlist=apoc.*

# 重啟生效

sudo systemctl restart neo4j

# 驗證

RETURN apoc.version();

4.5 代碼不使用apoc插件

如果插件apoc安裝還是失敗,那就修改代碼,不用apoc插件,這個插件比較快。面對大文件或者多種格式的文件都可以。

import pandas as pd
from neo4j import GraphDatabase
import chardet  # 用于自動檢測文件編碼# Neo4j 連接配置
NEO4J_URI = "neo4j://yourIP:7687"
NEO4J_USER = "neo4j"
NEO4J_PASSWORD = "password"  # 請替換為你的密碼def detect_encoding(file_path):"""自動檢測文件的編碼格式:param file_path: 文件路徑:return: 檢測到的編碼字符串,如 'utf-8', 'gbk' 等"""with open(file_path, 'rb') as f:raw_data = f.read(10000)  # 讀取文件前10000字節來檢測編碼,通常足夠result = chardet.detect(raw_data)encoding = result['encoding']confidence = result['confidence']print(f"文件 '{file_path}' 檢測到編碼: {encoding} (置信度: {confidence:.2f})")return encoding if confidence > 0.7 else 'utf-8'  # 如果置信度太低,則默認使用utf-8嘗試def read_csv_with_encoding(file_path, fallback_encodings=['utf-8', 'gbk', 'gb18030', 'iso-8859-1']):"""嘗試使用檢測到的或備選的編碼讀取CSV文件:param file_path: 文件路徑:param fallback_encodings: 備選編碼列表:return: DataFrame對象"""# 首先嘗試自動檢測編碼try:detected_encoding = detect_encoding(file_path)if detected_encoding:df = pd.read_csv(file_path, encoding=detected_encoding)print(f"使用檢測到的編碼 '{detected_encoding}' 成功讀取文件 '{file_path}'")return dfexcept Exception as e:print(f"使用檢測到的編碼 '{detected_encoding}' 讀取文件 '{file_path}' 失敗: {e}")print("開始嘗試備選編碼...")# 如果自動檢測失敗,則逐個嘗試備選編碼for enc in fallback_encodings:try:df = pd.read_csv(file_path, encoding=enc)print(f"使用備選編碼 '{enc}' 成功讀取文件 '{file_path}'")return dfexcept UnicodeDecodeError as e:print(f"備選編碼 '{enc}' 失敗: {e}")continueexcept Exception as e:print(f"使用備選編碼 '{enc}' 讀取文件時發生其他錯誤: {e}")continue# 所有編碼嘗試都失敗raise ValueError(f"無法讀取文件 '{file_path}',所有嘗試的編碼均失敗。")def import_to_neo4j(conversations_csv_path, chat_feedback_csv_path):"""將CSV數據導入Neo4j:param conversations_csv_path: 會話CSV文件路徑:param chat_feedback_csv_path: 反饋CSV文件路徑"""# 讀取CSV文件,處理編碼問題try:df_conversations = read_csv_with_encoding(conversations_csv_path)df_feedback = read_csv_with_encoding(chat_feedback_csv_path)# 確保日期列是字符串類型,避免后續處理問題for df in [df_conversations, df_feedback]:if 'created_at' in df.columns:df['created_at'] = df['created_at'].astype(str)if 'updated_at' in df.columns:df['updated_at'] = df['updated_at'].astype(str)except Exception as e:print(f"讀取CSV文件時發生錯誤: {e}")return# 初始化Neo4j驅動driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))try:with driver.session() as session:# 1. 清空現有數據庫(謹慎使用!根據需求決定是否保留)session.run("MATCH (n) DETACH DELETE n")# 2. 創建索引以提高查詢和導入性能[3](@ref)session.run("CREATE INDEX IF NOT EXISTS FOR (o:Organization) ON (o.org_id)")session.run("CREATE INDEX IF NOT EXISTS FOR (u:User) ON (u.user_id)")session.run("CREATE INDEX IF NOT EXISTS FOR (c:Conversation) ON (c.conversation_id)")session.run("CREATE INDEX IF NOT EXISTS FOR (f:Feedback) ON (f.created_at)")# 3. 批量處理組織、用戶和會話節點及其關系(使用UNWIND代替APOC)[1,3](@ref)print("開始導入會話數據...")conversations_batch = df_conversations.to_dict('records')batch_size = 10000  # 每批處理的數據量[3](@ref)for i in range(0, len(conversations_batch), batch_size):batch = conversations_batch[i:i+batch_size]create_nodes_relationships_query = """UNWIND $batch AS rowMERGE (org:Organization {org_id: row.org_id})MERGE (user:User {user_id: row.user_id})MERGE (conv:Conversation {conversation_id: row.conversation_id})ON CREATE SET conv.conversation_name = row.conversation_name,conv.conversation_len = row.conversation_len,conv.created_at = row.created_at,conv.updated_at = row.updated_atMERGE (user)-[:BELONGS_TO]->(org)MERGE (conv)-[:CREATED_BY {created_at: row.created_at}]->(user)"""session.run(create_nodes_relationships_query, batch=batch)print(f"已處理 {min(i+batch_size, len(conversations_batch))}/{len(conversations_batch)} 條會話記錄")print("會話數據導入完成!")# 4. 批量處理反饋節點及其關系(使用UNWIND代替APOC)print("開始導入反饋數據...")feedback_batch = df_feedback.to_dict('records')for i in range(0, len(feedback_batch), batch_size):batch = feedback_batch[i:i+batch_size]create_feedback_relationships_query = """UNWIND $batch AS rowMATCH (conv:Conversation {conversation_id: row.conversation_id})MATCH (user:User {user_id: row.user_id})MATCH (org:Organization {org_id: row.org_id})CREATE (feedback:Feedback {is_like: row.is_like,reasons: row.reasons,comment: row.comment,query: row.query,answer: row.answer,created_at: row.created_at,updated_at: row.updated_at})CREATE (conv)-[:HAS_FEEDBACK]->(feedback)CREATE (feedback)-[:SUBMITTED_BY {created_at: row.created_at}]->(user)CREATE (feedback)-[:ABOUT_ORGANIZATION]->(org)"""session.run(create_feedback_relationships_query, batch=batch)print(f"已處理 {min(i+batch_size, len(feedback_batch))}/{len(feedback_batch)} 條反饋記錄")print("反饋數據導入完成!")print("所有數據導入完成!")except Exception as e:print(f"導入Neo4j過程中發生錯誤: {e}")finally:driver.close()if __name__ == "__main__":try:import_to_neo4j(r"C:\Users\GDZD-BG-202115\Desktop\knowlege\medgraph-ai\data\conversations.csv",r"C:\Users\GDZD-BG-202115\Desktop\knowlege\medgraph-ai\data\chat_feedback.csv")except Exception as e:print(f"導入過程中發生錯誤: {e}")

導入數據成功后,就是增刪改查了。

五、參考資料

asanmateu/medgraph-ai:基于 Neo4j 知識圖譜的醫療保健 RAG 代理 - 使用 LangChain、FastAPI 和 Streamlit 查詢醫療數據 --- asanmateu/medgraph-ai: Healthcare RAG agent with Neo4j knowledge graphs - Query medical data using LangChain, FastAPI & Streamlit

Cypher 與 SQL 的比較 - 入門 --- Comparing Cypher with SQL - Getting Started

企業知識庫AI助手的知識圖譜構建架構:從數據到圖譜-CSDN博客

Neo4j簡介及安裝_neo4j安裝-CSDN博客

Neo4j簡介及安裝_neo4j安裝-CSDN博客

從關系型到圖數據庫:MySQL到Neo4j的平滑遷移策略_mysql數據導入neo4j-CSDN博客

使用 LangChain 構建 LLM RAG 聊天機器人 – Real Python --- Build an LLM RAG Chatbot With LangChain – Real Python

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95853.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95853.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【mysql】SQL查詢全解析:從基礎分組到高級自連接技巧

SQL查詢全解析:從基礎分組到高級自連接技巧詳解玩家首次登錄查詢的多種實現方式與優化技巧在數據庫查詢中,同一個需求往往有多種實現方式。本文將通過"查詢每個玩家第一次登錄的日期"這一常見需求,深入解析SQL查詢的多種實現方法&a…

MySQL常見報錯分析及解決方案總結(9)---出現interactive_timeout/wait_timeout

關于超時報錯,一共有五種超時參數,詳見:MySQL常見報錯分析及解決方案總結(7)---超時參數connect_timeout、interactive_timeout/wait_timeout、lock_wait_timeout、net等-CSDN博客 以下是當前報錯的排查方法和解決方案: MySQL 中…

第13章 Jenkins性能優化

13.1 性能優化概述 性能問題識別 常見性能瓶頸: Jenkins性能問題分類:1. 系統資源瓶頸- CPU使用率過高- 內存不足或泄漏- 磁盤I/O瓶頸- 網絡帶寬限制2. 應用層面問題- JVM配置不當- 垃圾回收頻繁- 線程池配置問題- 數據庫連接池不足3. 架構設計問題- 單點…

Python+DRVT 從外部調用 Revit:批量創建梁

今天讓我們繼續,看看如何批量創建常用的基礎元素:梁。 跳過軸線為直線段形的,先從圓弧形的開始: from typing import List, Tuple import math # drvt_pybind 支持多會話、多文檔,先從簡單的單會話、單文檔開始 # My…

水上樂園票務管理系統設計與開發(代碼+數據庫+LW)

摘 要 隨著旅游業的蓬勃發展,水上樂園作為夏日娛樂的重要組成部分,其票務管理效率和服務質量直接影響游客體驗。然而,傳統的票務管理模式往往面臨信息更新不及時、服務響應慢等問題。因此,本研究旨在通過設計并實現一個基于Spri…

【前端教程】JavaScript DOM 操作實戰案例詳解

案例1&#xff1a;操作div子節點并修改樣式與內容 功能說明 獲取div下的所有子節點&#xff0c;設置它們的背景顏色為紅色&#xff1b;如果是p標簽&#xff0c;將其內容設置為"我愛中國"。 實現代碼 <!DOCTYPE html> <html> <head><meta ch…

qiankun+vite+react配置微前端

微前端框架&#xff1a;qiankun。 主應用&#xff1a;react19vite7&#xff0c;子應用1&#xff1a;react19vite7&#xff0c;子應用2 &#xff1a;react19vite7 一、主應用 1. 安裝依賴 pnpm i qiankun 2. 注冊子應用 (1) 在src目錄下創建個文件夾&#xff0c;用來存儲關于微…

git: 取消文件跟蹤

場景&#xff1a;第一次初始化倉庫的時候沒有忽略.env或者node_modules&#xff0c;導致后面將.env加入.gitignore也不生效。 取消文件跟蹤&#xff1a;如果是因為 node_modules 已被跟蹤導致忽略無效&#xff0c; 可以使用命令git rm -r --cached node_modules來刪除緩存&…

開講啦|MBSE公開課:第五集 MBSE中期設想(下)

第五集 在本集課程中&#xff0c;劉玉生教授以MBSE建模工具選型及二次定制開發為核心切入點&#xff0c;系統闡釋了"為何需要定制開發"與"如何實施定制開發"的實踐邏輯&#xff0c;并提煉出MBSE中期實施的四大核心要素&#xff1a;高效高質建摸、跨域協同…

CSDN個人博客文章全面優化過程

兩天前達到博客專家申請條件&#xff0c;興高采烈去申請博客專家&#xff1a; 結果今天一看&#xff0c;申請被打回了&#xff1a; 我根據“是Yu欸”大神的博客&#xff1a; 【2024-完整版】python爬蟲 批量查詢自己所有CSDN文章的質量分&#xff1a;附整個實現流程_抓取csdn的…

Websocket的Key多少個字節

在WebSocket協議中&#xff0c;握手過程中的Sec-WebSocket-Key是一個由客戶端生成的隨機字符串&#xff0c;用于安全地建立WebSocket連接。這個Sec-WebSocket-Key是基于Base64編碼的&#xff0c;并且通常由客戶端在WebSocket握手請求的頭部字段中發送。根據WebSocket協議規范&a…

SVT-AV1編碼器中實現WPP依賴管理核心調度

一 assign_enc_dec_segments 函數。這個函數是 SVT-AV1 編碼器中實現波前并行處理&#xff08;WPP&#xff09; 和分段依賴管理的核心調度器之一。//函數功能&#xff1a;分配編碼解碼段任務//返回值Bool//True 成功分配了一個段給當前線程&#xff0c;調用者應該處理這個段//F…

直接讓前端請求代理到自己的本地服務器,告別CV報文到自己的API工具,解放雙手

直接使用前端直接調用本地服務器&#xff0c;在自己的瀏覽器搜索插件proxyVerse&#xff0c;類似的插件應該還有一些&#xff0c;可以選擇自己喜歡的這類插件可以將瀏覽器請求&#xff0c;直接轉發到本地服務器&#xff0c;這樣在本地調試的時候&#xff0c;不需要前端項目&…

Golang Goroutine 與 Channel:構建高效并發程序的基石

在當今這個多核處理器日益普及的時代&#xff0c;利用并發來提升程序的性能和響應能力已經成為軟件開發的必然趨勢。而Go語言&#xff0c;作為一門為并發而生的語言&#xff0c;其設計哲學中將“并發”置于核心地位。其中&#xff0c;Goroutines 和 Channels 是Go實現并發編程的…

17 C 語言宏進階必看:從宏替換避坑到宏函數用法,不定參數模擬實現一次搞定

預處理詳解1. 預定義符號//C語?設置了?些預定義符號&#xff0c;可以直接使?&#xff0c;預定義符號也是在預處理期間處理的。 __FILE__ //進?編譯的源?件--預處理階段被替換成指向文件名字符串的指針--char* 類型的變量 __LINE__ //?件當前的?號 --預處理階段替換成使用…

深入剖析 HarmonyOS ArkUI 聲明式開發:狀態管理藝術與最佳實踐

好的&#xff0c;請看這篇關于 HarmonyOS ArkUI 聲明式開發范式與狀態管理的技術文章。 深入剖析 HarmonyOS ArkUI 聲明式開發&#xff1a;狀態管理藝術與最佳實踐 引言 隨著 HarmonyOS 4、5 的廣泛應用以及面向未來的 HarmonyOS NEXT&#xff08;API 12&#xff09;的發布&…

Qwen-Code安裝教程

一、概述Qwen Code 是一個強大的基于命令行、面向開發者的 AI 工作流工具&#xff0c;改編自 Gemini CLI&#xff0c;專門針對 Qwen3-Coder 模型進行了優化。它專門為代碼理解、代碼重構、自動化工作流、Git 操作等場景設計&#xff0c;讓你的開發工作變得更高效、更智能。它既…

老師傅一分鐘精準判斷電池好壞!就靠這個神器!

在汽車維修與保養領域&#xff0c;蓄電池狀態的準確判斷一直是技術人員面臨的重要挑戰。傳統的電壓測量方法只能反映表面現象&#xff0c;無法深入評估蓄電池的實際健康狀態。Midtronics MDX-P300蓄電池及電氣系統測試儀作為專業級診斷設備&#xff0c;通過電導測試技術和多系統…

Axure筆記

Axure介紹 快速原型的軟件 應用場景&#xff1a;拉投資、給項目團隊、銷售演示、項目投標、內部收集反饋、教學 軟件安裝與漢化 漢化&#xff1a;復制lang文件夾和三個dll 軟件的基礎功能 基本布局&#xff1a;菜單欄、工具欄、頁面和摘要、元件和母版、畫布、樣式交互和說明設…

Pytorch Yolov11 OBB 旋轉框檢測+window部署+推理封裝 留貼記錄

Pytorch Yolov11 OBB 旋轉框檢測window部署推理封裝 留貼記錄 上一章寫了下【Pytorch Yolov11目標檢測window部署推理封裝 留貼記錄】&#xff0c;這一章開一下YOLOV11 OBB旋轉框檢測相關的全流程&#xff0c;有些和上一章重復的地方我會簡寫&#xff0c;要兩篇結合著看&#x…