Neo4j 圖數據庫 高級操作

Neo4j 圖數據庫 高級操作

文章目錄

  • Neo4j 圖數據庫 高級操作
    • 1 批量添加節點、關系
      • 1.1 直接使用 `UNWIND` 批量創建關系
      • 1.2 使用 CSV 文件批量創建關系
      • 1.3 選擇方法
    • 2 索引
      • 2.1 創建單一屬性索引
      • 2.2 創建組合屬性索引
      • 2.3 創建全文索引
      • 2.4 列出所有索引
      • 2.5 刪除索引
      • 2.6 注意事項
    • 3 清空所有數據
      • 3.1 刪除所有節點和關系
      • 3.2 使用 APOC 擴展
      • 3.3 重置數據庫(針對 Neo4j 4.0 及以上版本)
      • 3.4 刪除數據庫文件(僅適用于本地開發環境)
      • 3.5 注意事項

1 批量添加節點、關系

1.1 直接使用 UNWIND 批量創建關系

假設你已經有了 100,000 個節點數據和它們之間的關系數據,可以使用 UNWIND 語句來批量創建節點和關系。

  1. 批量創建節點

    首先,使用 UNWIND 創建節點。

    WITH [{eGuid: 'guid1', eId: 'id1', layer: 'layer1'},{eGuid: 'guid2', eId: 'id2', layer: 'layer2'},...{eGuid: 'guid100000', eId: 'id100000', layer: 'layer100000'}
    ] AS data
    UNWIND data AS row
    CREATE (n:Node {eGuid: row.eGuid, eId: row.eId, layer: row.layer})
    RETURN count(n)
    
  2. 批量創建關系

    假設關系數據如下:

    startGuid,endGuid,relationshipType
    guid1,guid2,RELATED_TO
    guid3,guid4,CONNECTED_TO
    ...
    guid99999,guid100000,ASSOCIATED_WITH
    

    將關系數據存儲在一個列表中,并使用 UNWIND 創建關系:

    WITH [{startGuid: 'guid1', endGuid: 'guid2', relationshipType: 'RELATED_TO'},{startGuid: 'guid3', endGuid: 'guid4', relationshipType: 'CONNECTED_TO'},...{startGuid: 'guid99999', endGuid: 'guid100000', relationshipType: 'ASSOCIATED_WITH'}
    ] AS relationships
    UNWIND relationships AS rel
    MATCH (startNode:Node {eGuid: rel.startGuid}), (endNode:Node {eGuid: rel.endGuid})
    CREATE (startNode)-[r:RELATIONSHIP {type: rel.relationshipType}]->(endNode)
    RETURN count(r)
    
  3. C# 代碼實現

    List<Dictionary<string, object>> nodeData = new List<Dictionary<string, object>>{new Dictionary<string, object>{{ "eGuid", guid },{ "eId", id },{ "layer", layer },}
    };
    IResultCursor batchInsertNode = await session.RunAsync(@"UNWIND $nodeData AS rowMERGE (n: PrimitiveNode { eGuid: row.eGuid, eId: row.eId, layer: row.layer})RETURN count(n)",new { nodeData });List<Dictionary<string, object>> relationData = new List<Dictionary<string, object>>{new Dictionary<string, object>{{ "startGuid", s_eGuid },{ "endGuid", t_eGuid },{ "relationName", relation },}
    };
    IResultCursor batchInsertRelation = await session.RunAsync(@"UNWIND $relationData AS relMATCH (startNode:PrimitiveNode {eGuid: rel.startGuid}), (endNode:PrimitiveNode {eGuid: rel.endGuid})MERGE (startNode)-[r:PrimitiveRelation {name: rel.relationName}]->(endNode)",new { relationData });
    

1.2 使用 CSV 文件批量創建關系

如果數據量很大,可以將數據存儲在 CSV 文件中,然后使用 LOAD CSV 導入。

  1. 創建 CSV 文件

    創建兩個 CSV 文件,一個用于節點數據,另一個用于關系數據。

    nodes.csv:

    eGuid,eId,layer
    guid1,id1,layer1
    guid2,id2,layer2
    ...
    guid100000,id100000,layer100000
    

    relationships.csv:

    startGuid,endGuid,relationshipType
    guid1,guid2,RELATED_TO
    guid3,guid4,CONNECTED_TO
    ...
    guid99999,guid100000,ASSOCIATED_WITH
    
  2. 加載 CSV 文件并創建節點

    LOAD CSV WITH HEADERS FROM 'file:///nodes.csv' AS row
    CREATE (:Node {eGuid: row.eGuid, eId: row.eId, layer: row.layer})
    RETURN count(*)
    
  3. 加載 CSV 文件并創建關系

    LOAD CSV WITH HEADERS FROM 'file:///relationships.csv' AS row
    MATCH (startNode:Node {eGuid: row.startGuid}), (endNode:Node {eGuid: row.endGuid})
    CREATE (startNode)-[r:RELATIONSHIP {type: row.relationshipType}]->(endNode)
    RETURN count(r)
    

1.3 選擇方法

  • 如果數據結構簡單,且數據量不大,可以直接在 Cypher 查詢中使用 UNWIND
  • 對于大量數據,CSV 文件導入方法非常高效。
  • 使用編程語言的批量插入方法適合需要復雜邏輯處理的數據。

2 索引

2.1 創建單一屬性索引

要在單個屬性上創建索引,可以使用以下命令:

CREATE INDEX index_name FOR (n:Label) ON (n.property)

例如:

CREATE INDEX person_name_index FOR (p:Person) ON (p.name)

2.2 創建組合屬性索引

要在多個屬性上創建組合索引,可以使用以下命令:

CREATE INDEX index_name FOR (n:Label) ON (n.property1, n.property2)

例如:

CREATE INDEX person_name_dob_index FOR (p:Person) ON (p.name, p.dob)

2.3 創建全文索引

Neo4j 還支持全文索引,可以用于全文搜索。要創建全文索引,可以使用以下命令:

CALL db.index.fulltext.createNodeIndex('index_name', ['Label'], ['property'])

例如:

CALL db.index.fulltext.createNodeIndex('person_name_index', ['Person'], ['name'])

2.4 列出所有索引

要查看數據庫中現有的所有索引,可以使用以下命令:

CALL db.indexes

2.5 刪除索引

要刪除一個索引,可以使用以下命令:

DROP INDEX index_name

例如:

DROP INDEX person_name_index

2.6 注意事項

  1. 索引創建時間:索引的創建可能需要一些時間,特別是在包含大量數據的情況下。建議在數據庫維護時創建索引。
  2. 索引類型:Neo4j 支持多種類型的索引,包括 B-tree 索引、全文索引等。選擇適合查詢需求的索引類型。
  3. 版本差異:不同版本的 Neo4j 在索引語法和功能上可能有所不同,建議查閱對應版本的官方文檔以獲取準確的信息。

3 清空所有數據

3.1 刪除所有節點和關系

  1. 刪除所有關系

    MATCH ()-[r]-()
    DELETE r
    
  2. 刪除所有節點

    MATCH (n)
    DELETE n
    

    該命令嘗試直接刪除匹配到的節點 n。如果節點 n 還有任何連接的關系,這條命令會失敗并報錯,因為 Neo4j 不允許直接刪除仍然連接著關系的節點。

    使用限制:只能刪除沒有任何關系的孤立節點。

  3. 刪除所有節點

    MATCH (n)
    DETACH DELETE n
    

    該命令不僅刪除匹配到的節點 n,還會先刪除與該節點連接的所有關系。這樣就避免了直接刪除節點時可能遇到的錯誤。

    使用優勢:能夠刪除任何節點,無論它們是否連接著關系。

3.2 使用 APOC 擴展

如果安裝了 APOC 擴展,可以使用更簡便的方法:

CALL apoc.periodic.iterate('MATCH (n) RETURN n','DETACH DELETE n',{batchSize: 1000}
)

3.3 重置數據庫(針對 Neo4j 4.0 及以上版本)

如果你使用的是 Neo4j 4.0 及以上版本,可以使用 dbms.clearDatabase() 命令重置數據庫:

CALL dbms.clearDatabase()

3.4 刪除數據庫文件(僅適用于本地開發環境)

如果你在本地開發環境中,可以通過刪除數據庫文件來清空所有數據。這需要停止 Neo4j 服務,刪除數據庫文件,然后重新啟動服務。

  1. 停止 Neo4j 服務

    neo4j stop
    
  2. 刪除數據庫文件

    默認情況下,數據庫文件位于 data/databases/ 目錄下。例如,對于默認數據庫 neo4j,刪除相應文件:

    rm -rf data/databases/neo4j
    
  3. 重新啟動 Neo4j 服務

    neo4j start
    

3.5 注意事項

  1. 備份數據:在清空數據之前,建議先備份現有數據,以防需要恢復。
  2. 權限:確保執行清空數據操作的用戶具有足夠的權限。
  3. 環境:在生產環境中執行這些操作時要格外小心,確保不會影響正常運行的數據和服務。

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

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

相關文章

后端之路第三站(Mybatis)——JDBC跟Mybatis、lombok

一、什么是JDBC JDBC就是sun公司研發的一套通過java來操控數據庫的工具&#xff0c;對應不同的數據庫系統有不同的JDBC&#xff0c;而他們統稱【驅動】&#xff0c;這就是上一篇我們提到創建Mybatis項目時要引入的依賴、以及連接數據庫四要素里的第一要素。 JDBC有自己一套原始…

SerialportToTCP② 全

效果補全&#xff08;代碼&#xff09;&#xff1a; namespace SerialportToTCP {public partial class Form1 : Form{IniHelper Ini;string[] botelvs new string[] { "1200", "4800", "9600", "13200" };public Form1(){Initializ…

Elasticsearch:Painless scripting 語言(一)

Painless 是一種高性能、安全的腳本語言&#xff0c;專為 Elasticsearch 設計。你可以使用 Painless 在 Elasticsearch 支持腳本的任何地方安全地編寫內聯和存儲腳本。 Painless 提供眾多功能&#xff0c;這些功能圍繞以下核心原則&#xff1a; 安全性&#xff1a;確保集群的…

安卓gdb 建立鏈接

adbshell gdbserver :1234 testdcam --sensor 0 --workmode 0 --args preview-size1024x600,picture-size640x480, --time 10 adb forwardtcp:1234 tcp:1234 //設置adb的轉發 ./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gdb out/tar…

近紅外光譜腦功能成像(fNIRS):1.光學原理、變量選取與預處理

一、朗伯-比爾定律與修正的朗伯-比爾定律 朗伯-比爾定律 是一個描述光通過溶液時被吸收的規律。想象你有一杯有色液體&#xff0c;比如一杯紅茶。當你用一束光照射這杯液體時&#xff0c;光的一部分會被液體吸收&#xff0c;導致透過液體的光變弱。朗伯-比爾定律告訴我們&#…

mmdetection3D指定版本安裝指南

1. 下載指定版本號 選擇指定版本號下載mmdetection3d的源碼&#xff0c;如這里選擇的是0.17.2版本 git clone https://github.com/open-mmlab/mmdetection3d.git -b v0.17.22. 安裝 cd mmdetection3d安裝依賴庫 pip install -r requirment.txt編譯安裝 pip install -v e .…

redis主從復制哨兵模式集群管理

主從復制&#xff1a; 主從復制是高可用Redis的基礎&#xff0c;哨兵和集群都是在主從復制基礎上實現高可用的。主從復制主要實現了數據的多機備份&#xff0c;以及對于讀操作的負載均衡和簡單的故障恢復。缺陷&#xff1a;故障恢復無法自動化&#xff1b;寫操作無法負載均衡&…

軟件測試與質量保證 | 云班課簡答題庫

目錄 第14章 質量相關簡答題 第15章 測試實際相關簡答題 第16章 測試基本相關簡答題 第14章 質量相關簡答題 1. 簡述基本的測量原則。 測量應該基于該應用領域正確的理論之上&#xff0c;并在測量的定義中確定測度的目標&#xff1b;每一個技術測量的定義應該具有一致性和客…

HbuilderX:安卓打包證書.keystore生成與使用

前置條件 已安裝jdk或配置好jre環境。 .keystore生成 打開cmd,切換到目標路徑,輸入以下命令, keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore 輸入密鑰庫口令(要記住), 然后輸入一系列信息, …

ui.perfetto.dev sql 查詢某個事件范圍內,某個事件的耗時并降序排列

ui.perfetto.dev sql 查詢某個事件范圍內,某個事件的耗時并降序排列 1.打開https://ui.perfetto.dev 導入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.點擊Query(SQL),在輸入框中輸入以下內容,按CtrlEnter,顯示查詢結果4.點擊Show timeline,點擊…

2024年07年01日 Redis數據類型以及使用場景

String Hash List Set Sorted Set String&#xff0c;用的最多&#xff0c;對象序列化成json然后存儲 1.對象緩存&#xff0c;單值緩存 2.分布式鎖 Hash&#xff0c;不怎么用到 1.可緩存經常需要修改值的對象&#xff0c;可單獨對對象某個屬性進行修改 HMSET user {userI…

Windows快速打開某個路徑下的PowerShell

按住Shift右鍵打開&#xff1a; 在桌面或者文件夾頁面中&#xff0c;按住右鍵&#xff0c;在彈出的右鍵菜單中選擇“在終端中打開”或“在此處打開Powershell窗口“&#xff0c;就可打開windows PowerShell界面&#xff0c;且路徑為桌面或打開的文件夾所在路徑。

淺談貝葉斯定理

引言 貝葉斯定理用于確定事件的條件概率。它以一位英國統計學家的名字命名&#xff0c;托馬斯貝葉斯他在1763年發現了這個公式。貝葉斯定理是數學中一個非常重要的定理&#xff0c;它為一種獨特的統計推斷方法奠定了基礎。貝氏推論它用于根據可能與事件相關的條件的先驗知識&a…

C++基礎(三):C++入門(二)

上一篇博客我們正式進入C的學習&#xff0c;這一篇博客我們繼續學習C入門的基礎內容&#xff0c;一定要學好入門階段的內容&#xff0c;這是后續學習C的基礎&#xff0c;方便我們后續更加容易的理解C。 目錄 一、內聯函數 1.0 產生的原因 1.1 概念 1.2 特性 1.3 面試題 …

用隨機森林算法進行的一次故障預測

本案例將帶大家使用一份開源的S.M.A.R.T.數據集和機器學習中的隨機森林算法&#xff0c;來訓練一個硬盤故障預測模型&#xff0c;并測試效果。 實驗目標 掌握使用機器學習方法訓練模型的基本流程&#xff1b;掌握使用pandas做數據分析的基本方法&#xff1b;掌握使用scikit-l…

三大常用集合

1.Set集合 在Java中&#xff0c;Set是一種集合類型&#xff0c;它是一種不允許包含重復元素的集合&#xff0c;每個元素在Set中是唯一的。Set接口的常用實現類有HashSet、TreeSet和LinkedHashSet。以下是關于Set集合的一些重要特點和用法&#xff1a; 特點&#xff1a; 不允…

什么是mysql的回表操作

MySQL中的“回表”操作是指在執行查詢時&#xff0c;由于索引結構的限制&#xff0c;數據庫系統需要從非聚集索引&#xff08;Secondary Index&#xff09;中找到主鍵值&#xff0c;然后使用這些主鍵值回溯到聚集索引&#xff08;Clustered Index&#xff09;中獲取完整的行數據…

珠江電纜,承載您夢想的每一度電

在現代社會&#xff0c;電力無處不在&#xff0c;它不僅是經濟發展的動力&#xff0c;更是每個人生活中不可或缺的能量來源。而在這個電力驅動的世界里&#xff0c;有一家企業默默地承載著千家萬戶的夢想&#xff0c;它就是珠江電纜。 連接夢想的每一度電 珠江電纜成立于2001…

使用Java實現單元測試:JUnit教程

使用Java實現單元測試&#xff1a;JUnit教程 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在軟件開發中&#xff0c;單元測試是保證代碼質量和功能正確性的重要手段之一。JUnit是Java語言中最流行…

絕區零國際服下載 一鍵下載絕區零國際服教程

絕區零是一款米哈游傾情打造的全新都市幻想動作角色扮演游戲。在游戲中&#xff0c;我們將扮演一名繩匠&#xff0c;這是為出于各種原因需要進入危險空洞的人提供指引的專業人士。您將與獨特的角色一起踏上冒險之旅&#xff0c;攜手探索空洞&#xff0c;對戰強大敵人&#xff0…