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
語句來批量創建節點和關系。
-
批量創建節點:
首先,使用
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)
-
批量創建關系:
假設關系數據如下:
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)
-
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
導入。
-
創建 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
-
加載 CSV 文件并創建節點:
LOAD CSV WITH HEADERS FROM 'file:///nodes.csv' AS row CREATE (:Node {eGuid: row.eGuid, eId: row.eId, layer: row.layer}) RETURN count(*)
-
加載 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 注意事項
- 索引創建時間:索引的創建可能需要一些時間,特別是在包含大量數據的情況下。建議在數據庫維護時創建索引。
- 索引類型:Neo4j 支持多種類型的索引,包括 B-tree 索引、全文索引等。選擇適合查詢需求的索引類型。
- 版本差異:不同版本的 Neo4j 在索引語法和功能上可能有所不同,建議查閱對應版本的官方文檔以獲取準確的信息。
3 清空所有數據
3.1 刪除所有節點和關系
-
刪除所有關系:
MATCH ()-[r]-() DELETE r
-
刪除所有節點:
MATCH (n) DELETE n
該命令嘗試直接刪除匹配到的節點
n
。如果節點n
還有任何連接的關系,這條命令會失敗并報錯,因為 Neo4j 不允許直接刪除仍然連接著關系的節點。使用限制:只能刪除沒有任何關系的孤立節點。
-
刪除所有節點:
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 服務,刪除數據庫文件,然后重新啟動服務。
-
停止 Neo4j 服務:
neo4j stop
-
刪除數據庫文件:
默認情況下,數據庫文件位于
data/databases/
目錄下。例如,對于默認數據庫neo4j
,刪除相應文件:rm -rf data/databases/neo4j
-
重新啟動 Neo4j 服務:
neo4j start
3.5 注意事項
- 備份數據:在清空數據之前,建議先備份現有數據,以防需要恢復。
- 權限:確保執行清空數據操作的用戶具有足夠的權限。
- 環境:在生產環境中執行這些操作時要格外小心,確保不會影響正常運行的數據和服務。