一、neo4j-admin簡要介紹
neo4j-admin是管理neo4j DBMS的主要工具之一,是一種命令行工具。
neo4j admin命令需與當(dāng)前neo4j用戶一致。
(1)位置:以neo4j desktop為例,neo4j-admin在當(dāng)前project下活動的database的dbms文件夾下的bin文件夾中。
(2)啟動方式:
- 打開當(dāng)前project的terminal;
- 進(jìn)入bin文件夾:執(zhí)行cd bin,此時,輸入neo4j-admin XX(命令)即可。
(3)語法:neo4j-admin [-hv] [COMMAND],常用命令如下:
? ? ? ? 注意環(huán)境和neo4j-admin 版本!
- neo4j-admin -h 或?neo4j-admin --help:顯示neo4j-admin幫助信息;
- neo4j-admin -v 或?neo4j-admin --version:打印neo4j-admin版本信息;
- neo4j-admin import:從一系列CSV文件中導(dǎo)入數(shù)據(jù),使用詳見下一節(jié)。
二、neo4j-admin import命令
(1)用途:可用于批量導(dǎo)入CSV數(shù)據(jù)。
(2)前提:使用者必須有權(quán)限對dbmis.directories.data 和dbms.directories.log進(jìn)行寫入操作。
(3)特點:僅可用于初始化未運行的空數(shù)據(jù)庫或創(chuàng)建新的數(shù)據(jù)庫,即:即便一個已存在的存儲過數(shù)據(jù)的數(shù)據(jù)庫被清空也無法執(zhí)行import命令。
(4)vs LOAD CSV:
LOAD CSV | 用于將中小型CSV文件數(shù)據(jù)導(dǎo)入已存在的數(shù)據(jù)庫 可按需執(zhí)行LOAD CSV命令多次 |
neo4j-admin import | 用于批量導(dǎo)入格式化的CSV文件 僅可對空數(shù)據(jù)庫使用一次 注意:該命令為離線運行,即:執(zhí)行該命令前數(shù)據(jù)庫應(yīng)處于未運行狀態(tài)(關(guān)閉server),執(zhí)行后許重啟neo4j sever,詳見下文。 |
(5)import 命令的使用:
neo4j-admin import? [Options]
- Options為可選項,如有多個,用空格隔開,支持以下選項:
- --expand -comannds:
- --verbose:
- --cache-on-heap[=true/false]:
- --force[=true/false]:默認(rèn)為false,如設(shè)置為true表示在導(dǎo)入數(shù)據(jù)前將存在的數(shù)據(jù)庫文件刪除,可用于需重新導(dǎo)入數(shù)據(jù)的場景,例如:在導(dǎo)入真實數(shù)據(jù)前,先導(dǎo)入了測試數(shù)據(jù),打算先看看導(dǎo)入后數(shù)據(jù)是什么樣子,那么可以設(shè)置--force=true,這樣可以對同一個數(shù)據(jù)庫進(jìn)行重新導(dǎo)入;
- --high-io[=true/false]:默認(rèn)為false,如設(shè)置為true
- --ignore-empty-strings[=true/false]:確定是否忽略數(shù)據(jù)空字段,默認(rèn)為false
- --trim-strings=[true/false]:確定是否在遇到空白行時認(rèn)為是null,默認(rèn)為false
三、CSV格式化文件
? ? ? ? neo4j-admin import命令處理的CSV文件需要滿足特定的格式,即CSV格式化文件,分為兩類:節(jié)點文件(node files) 和 關(guān)系文件(relationship files)?;靖袷綖殒I值對,如下:
<name>:<field_type>
- name:指節(jié)點屬性和節(jié)點ID,其他字段如LABEL等省略name;
- field_type:指字段類型,例如:ID、LABEL等。
(1)其他要求
- CSV文件的編碼格式需為UTF-8。
(2) 建議
- 表頭單獨建文件,以便處理和編輯;
- 用文本編輯器如notepad、vscode等編輯CSV文件,不建議直接用excel或wps編輯,容易導(dǎo)致亂碼等問題。
3.1?節(jié)點文件格式
? ? ? CSV節(jié)點文件的表頭格式如下:
<nodeId:ID>, <propertyName1>, <propertyName2>, ..., <:LABEL>
- nodeId:ID:自定義的節(jié)點編號,對于每個節(jié)點這個編號是唯一的,用于創(chuàng)建關(guān)系等后續(xù)import操作時索引到指定節(jié)點;
- propertyNameX:節(jié)點屬性,對于屬性,field_type指data_type,默認(rèn)為string,可定義的data_type如下表所示;
- :LABEL:(注意前面有冒號,省略了name)非必選,用于指定節(jié)點的標(biāo)簽,1個節(jié)點可以有多個標(biāo)簽,賦值時多個標(biāo)簽之間用該CSV文件的分隔符隔開,默認(rèn)為“;”。
屬性可定義的data_type(field_type): | |
---|---|
數(shù)值類 | int, long, float, double |
布爾值 | boolean |
字符類 | byte, short, char, string |
點類型 | point |
日期時間 | date, localtime, time, localdatetime, datetime, duration |
? ? 例1:movies.csv,文件內(nèi)容如下:
movieId:ID,title,year:int,:LABEL
tt0133093,"The Matrix",1999,Movie
tt0234215,"The Matrix Reloaded",2003,Movie;Sequel
tt0242653,"The Matrix Revolutions",2003,Movie;Sequel
? ? ? ? movies.csv 定義了3個(電影)節(jié)點:
- 節(jié)點1:ID為tt0133093,名字為The Matrix,年份為1999(整數(shù)類型),標(biāo)簽為Movie;
- 節(jié)點2:ID為tt0234215,名稱為The Matrix Reloaded,年份為2003(整數(shù)類型),標(biāo)簽為Movie和Sequel;
- 節(jié)點3:ID為tt0242653,名字為The Matrix Revolutions,年份為2003(整數(shù)類型),標(biāo)簽為Movie和Sequel。
? ? 例2:actors_header.csv及actors.csv,文件內(nèi)容如下:
actors_header.csv:
personId:ID,name,:LABEL
actors.csv:
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor
? ? ? ? ?actors_header.csv和actors.csv定義了3個(演員)節(jié)點:
- 節(jié)點1:ID為keanu,名字為Keanu Reeves,標(biāo)簽為Actor;
- 節(jié)點2:ID為laurence,名字為Laurence Fishburne,標(biāo)簽為Actor;
- 節(jié)點3:ID為carrieanne,名字為Carrie-Anne Moss,標(biāo)簽為Actor。
3.2?關(guān)系文件格式
CSV關(guān)系文件基本的表頭格式為:
<:START_ID>, <:TYPE>, <:END_ID>, <RelationshipPropertiesName1>,...<RelationshipPropertiesName2>
- :START_ID:關(guān)系的起始節(jié)點編號(The ID of the start node for this relationship)必須有;
- :TYPE:關(guān)系的類別(relationship types),例如:WORKS_FOR, CONTAINS...,必須有;
- :END_ID:關(guān)系的結(jié)束節(jié)點編號(The ID of the end node for this relationship),必須有;
- RelationshipPropertiesNameX:關(guān)系的屬性,非必須。
- <:START_ID>和<:END_ID>不需要定義name,如果定義了<name>:<START_ID>或<name>:<END_ID>,則自動忽略<name>。
? ? 例3:(基于例1、例2)roles_header.csv和roles.csv內(nèi)容如下:
roles_header.csv:
:START_ID,role,:END_ID,:TYPE
roles.csv:
keanu,"Neo",tt0133093,ACTED_IN
keanu,"Neo",tt0234215,ACTED_IN
keanu,"Neo",tt0242653,ACTED_IN
laurence,"Morpheus",tt0133093,ACTED_IN
laurence,"Morpheus",tt0234215,ACTED_IN
laurence,"Morpheus",tt0242653,ACTED_IN
carrieanne,"Trinity",tt0133093,ACTED_IN
carrieanne,"Trinity",tt0234215,ACTED_IN
carrieanne,"Trinity",tt0242653,ACTED_IN
? ? ? ? roles_header.csv和roles.csv定義了一類關(guān)系,創(chuàng)建了9條關(guān)系:
- 關(guān)系1:ID為keanu的Actor?? ACTED_IN? ID為tt0133093的Movie,扮演的role為Neo;
- 關(guān)系2:ID為keanu的Actor?? ACTED_IN? ID為tt0234215的Movie,扮演的role為Neo;
- 關(guān)系3:ID為keanu的Actor?? ACTED_IN? ID為tt0242653的Movie,扮演的role為Neo;
- 關(guān)系4:ID為laurence的Actor?? ACTED_IN? ID為tt0133093的Movie,扮演的role為Morpheus;
- 關(guān)系5:ID為laurence的Actor?? ACTED_IN? ID為tt0234215的Movie,扮演的role為Morpheus;
- 關(guān)系6:ID為laurence的Actor?? ACTED_IN? ID為tt0242653的Movie,扮演的role為Morpheus;
- 關(guān)系7:ID為carrieanne的Actor?? ACTED_IN? ID為tt0133093的Movie,扮演的role為Trinity;
- 關(guān)系8:ID為carrieanne的Actor?? ACTED_IN? ID為tt0234215的Movie,扮演的role為Trinity;
- 關(guān)系9:ID為carrieanne的Actor?? ACTED_IN? ID為tt0242653的Movie,扮演的role為Trinity。
3.3 補(bǔ)充說明
(1)除name:ID、:LABEL、:START_ID、:END_ID、:TYPE外的列都被認(rèn)為是屬性:
- 如果“:”前名稱省略,則該列數(shù)據(jù)讀取;
- 如果為“name:”或者為“:IGNORE”,則該列數(shù)據(jù)不讀取。
(2)name:ID:該鍵值對的設(shè)置是為了設(shè)置全局ID用于后續(xù)查詢節(jié)點時使用:
- 如果跨實體有重復(fù)的ID編號,則需要按照“name:ID(group)”形式設(shè)置該鍵值對;
- 如果定義的ID編號是全局唯一的,不需要定義group。
3.4 常見坑
(1)表頭問題:表頭與數(shù)據(jù)不一致,例如:缺失列、多列、表頭分隔符與數(shù)據(jù)分隔符不一致等。在導(dǎo)入CSV文件時,提前確認(rèn)表頭沒有這些問題將節(jié)省大量時間。
(2)引號問題:文件正文內(nèi)容中引號,需要考慮轉(zhuǎn)義問題。
3.5 常用數(shù)據(jù)清洗工具
(1)CSVKit:python提供一系列數(shù)據(jù)清洗和格式化工具,如csvstat、csvgrep等。
(2)CSVLint:一種線上處理CSV文件的網(wǎng)站,CSV Lint | Check your CSV files with CSVLint
(3) papa parse:Javascript庫用于處理CSV文件。
四、使用neo4j-admin import命令批量處理CSV文件
舉例說明批量處理方法:
import文件夾下現(xiàn)有以下CSV文件:
(1)cutomers.csv
customers.csv:
customerId:ID(Customer), name
23, Delicatessen Inc
42, Delicious Bakery
(2)products.csv
products.csv:
productId:ID(Product), name, price, :LABEL
11,Chocolate,10,Product;Food
(3)orders_header.csv
orders_header.csv:
orderId:ID(Order),date,total,customerId:IGNORE
(4)customer_orders_header.csv
customer_orders_header.csv:
:END_ID(Order),date:IGNORE,total:IGNORE,:START_ID(Customer)
(5)orders1.csv
orders1.csv:
1041,2020-05-10,130,23
(6)orders2.csv
orders2.csv:
1042,2020-05-12,20,42
(7)order_details.csv
order_details.csv:
:START_ID(Order),amount,price,:END_ID(Product)
1041,13,130,11
1042,2,20,11
?執(zhí)行如下neo4j-admin命令:
../bin/neo4j-admin import --database=orders
--nodes=Customer=import/customers.csv
--nodes=import/products.csv
--nodes=Order="import/orders_header.csv,import/orders1.csv,import/orders2.csv"
--relationships=CONTAINS=import/order_details.csv
--relationships=ORDERED="import/customer_orders_header.csv,import/orders1.csv,orders2.csv"
--trim-strings=true
?(注:此處為了便于閱讀使用分行顯示,實際操作時不分行,用空格隔開)
執(zhí)行后:
- 創(chuàng)建了名為orders的新數(shù)據(jù)庫(--database=orders);
- 創(chuàng)建了LABEL為Customer的節(jié)點,節(jié)點文件為customers.csv:節(jié)點1:ID(編號)為23,name(屬性名稱)為Delicatessen Inc;節(jié)點2:ID(編號)為42,name(屬性名稱)為Delicious Bakery;這里表頭customerId:ID(Customer)的Customer定義了該節(jié)點的group為Customer,目的是防止在跨實體查詢節(jié)點編號時有重復(fù)的ID編號。
- 創(chuàng)建了LABEL為Product和Food的節(jié)點(LABEL定義來自products.csv的表頭),節(jié)點文件為products.csv,節(jié)點1:ID(編號)為11,name(屬性:名稱)為Chocolate,price(屬性:價格)為10。
- 創(chuàng)建了LABEL為Order的節(jié)點,節(jié)點文件為orders_header.csv、orders1.csv、orders2.csv,節(jié)點1:ID(編號)為1041,date(屬性:日期)為2020-05-10,total(屬性:總數(shù))為130;節(jié)點2:ID(編號)為1042,date(屬性:日期)為2020-05-12,total(屬性:總數(shù))為20。:IGNORE列表示省略(該列設(shè)置的目的是為了對應(yīng)orders1.csv和orders2.csv的數(shù)據(jù)列,這兩個文件被重復(fù)使用)
- 創(chuàng)建了關(guān)系類型Type為CONTAINS的關(guān)系,關(guān)系文件為orders_details.csv,關(guān)系1:START_ID(起始節(jié)點編號)為group為Order的1041,END_ID(結(jié)束節(jié)點編號)為group為Product的11,amount(屬性:數(shù)量)為13,price(屬性:價格)為130;關(guān)系2:START_ID(起始節(jié)點編號)為group為Order的1042,END_ID(結(jié)束節(jié)點編號)為group為Product的11,amount(屬性:數(shù)量)為2,price(屬性:價格)為20。
- 創(chuàng)建了關(guān)系類型Type為ORDERED的關(guān)系,關(guān)系文件為customer_orders_header.csv、orders1.csv、orders2.csv,關(guān)系1:START_ID(起始節(jié)點編號)為group為Customer的23,END_ID(結(jié)束節(jié)點編號)為group為Order的1041,關(guān)系無屬性;關(guān)系2:START_ID(起始節(jié)點編號)為group為Customer的42,END_ID(結(jié)束節(jié)點編號)為group為Order的1042,無其他關(guān)系屬性。
- 設(shè)置trim-strings=true表示:如字符串值為空白行,則認(rèn)為該值為null。
五、導(dǎo)入后在neo4j browser/desktop查詢數(shù)據(jù)
- 使用neo4j-admin import前關(guān)閉server;
- 執(zhí)行neo4j-admin import命令,database=dbName,確認(rèn)導(dǎo)入成功;
- 打開neo4j browser/desktop server;
- 創(chuàng)建與database名稱相同的數(shù)據(jù)庫(即執(zhí)行:create database?dbName),切換到該數(shù)據(jù)庫(dbName)后即可使用查詢語句。
參考:Re: Neo4j-admin import successful but no data show... - Neo4j - 13384neo4j import顯示成功但是查詢沒有數(shù)據(jù)_mydoubts的博客-CSDN博客_neo4j導(dǎo)入csv文件成功但查不到數(shù)據(jù)
本文參考neo4j官方文檔:
Import - Operations Manual文章來源:http://www.zghlxwxcb.cn/news/detail-789966.html
Importing CSV Data into Neo4j - Developer Guides文章來源地址http://www.zghlxwxcb.cn/news/detail-789966.html
到了這里,關(guān)于neo4j學(xué)習(xí)筆記:使用neo4j-admin import命令批量處理CSV文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!