neo4j學習總結--第九課 neo4j 數據導入與導出

一、導入工具

導入CSV文件的方式:

  1. Load CSV 指令 (增量式導入的導入到原數據庫總)
  2. neo4j-import 、neo4j-admin命令行工具(導入到新建的數據庫中)
  3. 第三方導入工具,如batch-import (不推薦)

       batch-import工具下載地址:https://github.com/jexp/batch-import

Neo4j命令行導入工具有兩種:

  1. neo4j-import
  2. neo4j-admin import (推薦使用)

兩種工具使用方式相同,推薦使用neo4j-admin import

1.1、準備csv數據文件

         以電影、演員和角色圖數據集爲例,先將path_to_target_directory修改爲數據庫文件目錄,默認安裝下path_to_target_directory指向<neo4j-home>/data/databases/graph.db文件。其中電影節點文件爲movies.csv,每部電影都有一個編號id,便於外部數據源的引用,另外每部電影都有電影名和年份屬性,併爲每個節點添加了Movie和Sequel標籤。該文件內容示例如下:

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

演員節點文件爲actors.csv,每個演員有兩個屬性:編號(姓名的縮寫)、姓名,並帶有Actor屬性,該文件內容示例如下:

personId:ID,name,:LABEL
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor

接下來,角色文件爲roles.csv,保存演員與電影之間的關係,START_ID爲演員節點中的編號,END_ID爲電影中的編號,role字段爲該演員在這部電影中所扮演的角色名,TYPE字段爲關係類型(在本例中爲ACTED_IN)。該文件內容示例如下:

:START_ID,role,:END_ID,:TYPE
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

1.2、使用導入命令導入

導入前確保Neo4j是關閉的狀態

 注意 :neo4j-import、neo4j-admin import 工具,並不是增量往數據庫裏導入數據,而已直接生成一個導入了csv數據的新數據庫

接下來調用數據導入neo4j-import命令如下:

neo4j-import --into newgraph.db --nodes movies.csv --nodes actors.csv --relationships roles.csv

    注意:movies.csv actors.csv roles.csv三個文件必須放在neo4j-import命令文件同一目錄下,否則必須指定完整路徑 另外,–into newgraph.db 會在neo4j-import命令文件同一目錄下創建一個新的 graph.db數據文件,而不是neo4j默認數據庫,想要導入到neo4j默認數據庫,需要指定默認數據庫graph.db的完整路徑

neo4j- admin  import命令如下:

neo4j-admin  import --nodes movies.csv --nodes actors.csv --relationships roles.csv

neo4j- admin 不指定導入的目標數據庫則默認爲neo4j的默認數據庫

完成後則可以啓動數據庫,命令如下:

neo4j start

1.3、CSV文件注意事項

在創建輸入文件時需要注意如下幾點:

  1. 默認情況下,字段以逗號分隔,但可以指定其它分隔符;
  2. 所有文件必須使用相同的分隔符;
  3. 節點和關係可以保存在多個數據源;
  4. 數據源可來源於多個文件;
  5. 提供數據字段信息的標題必須位於每個數據源的第一行;
  6. 在標題中沒有相應信息的字段將不會被導入;
  7. 採用UTF-8編碼

導入時不需要創建索引,導入完成後再添加。

如果無法使用此工具進行數據導入,且加載的CSV文件爲中小型,可以使用LOAD CSV方式。

1.4、 CSV文件頭格式

      每個數據源的標題行負責解釋文件中的字段,標題行與餘下數據行具有相同的定界符。每個字段的格式爲:<name>:<field_type>,<name>爲屬性值, <field_type>用於節點和關係:

        屬性值(Property value)——數據類型可以是:int、long、float、double、boolean、byte、short、char、string。如果未指定數據類型,則默認爲string類型。數組類型在上述類型後面加上[]即可。默認情況下,數組值由分號(;)分隔,也可以使用--array-delimiter指定爲其它分隔符。

     節點(Node)——節點須有ID和LABEL字段,每個節點在導入前必須指定唯一編號(ID),以利於在創建關係時能正確查找到相應的節點。ID必須唯一,即使某節點具有不同的標籤。LABEL字段用於讀取一個或多個標籤,與數組類似,多個標籤由分號(;)分隔,或由--array-delimiter來指定分隔符。

     關係(Relationship)——對於關係數據源,有三個必填字段:TYPE、START_ID和END_ID。TYPE爲關係類型,START_ID爲關係起始節點編號,END_ID爲關係終止節點編號。

    導入工具默認假定節點標識符在節點之間是唯一的。如果不唯一,還可以定義一個編號空間(ID space),編號空間由節點文件的ID字段來定義。例如,要指定Person 的編號空間,只需在people節點文件中使用字段類型ID(Person),在關係文件(即START_ID(Person)或END_ID(Person))中引用該編號空間即可。

1.5、命令行運行導入工具

       在Unix/Linux/OSX操作系統中,導入工具命令名爲neo4j-import。與安裝配置相關,導入工具可能在任意路徑下調用,可能僅在安裝目錄中執行。而Windows系統則在安裝目錄下執行bin\neo4j-import命令即可。該命令有如下參數:

 --into <store-dir>:要導入到的數據庫目錄,該目錄下不能包含已有數據庫。

--nodes[:Label1:Label2] "<file1>,<file2>,…​":節點CSV標題和數據,如果帶有多個文件將在邏輯上視爲一個大文件。第一行必須爲標題,每個數據源都有自己的標題。注意,一組文件必須用引號括起來。

--relationships[:RELATIONSHIP_TYPE] "<file1>,<file2>,…​":關係CSV標題和數據。同樣,多個文件將在邏輯上視爲一個大文件,第一行必須爲標題,每個數據源都有自己的標題,一組文件必須用引號括起來。

--delimiter <delimiter-character>:CSV文件中數據分隔符或TAB製表符,缺省爲逗號。

--array-delimiter <array-delimiter-character>:CSV文件中數組元素之間的分隔符或TAB製表符,缺省爲封號。

--quote <quotation-character>:設定CSV數據中值的引用字符,缺省爲引號。引號裏面的引號需要轉義,比如:"""Go away"", he said."和"\"Go away\", he said."兩種方式系統都支持。如果設置'爲引用字符,則上例需要改寫爲:'"Go away", he said.'

--multiline-fields <true/false>:來自輸入字段是否可以跨行,即是否包含換行符,默認不包含,即值爲:false。

--input-encoding <character set>:輸入數據的編碼字符集,必須是JVM中的可用字符集,可通過Charset#availableCharsets()方法查詢獲取,如果未指定編碼,則使用JVM的缺省字符集。

--ignore-empty-strings <true/false>:空字符串字段是否被忽略,默認不忽略,值爲:false。

--id-type <id-type>:指定節點/關係中編號字段的數據類型,可以爲:STRING、INTEGER、ACTUAL。STRING:爲字符串;INTEGER:爲整數值;ACTUAL:以實際節點標識爲其類型。默認值爲:STRING。

--processors <max processor count>:(高級選項)指定導入工具可以使用的最多處理器數量。默認爲JVM所檢測的可用處理器數。爲了獲得最佳性能,此值不應大於可用處理器的數量。

--stacktrace <true/false>:是否啓用打印錯誤堆棧跟蹤信息。

--bad-tolerance <max number of bad entries>:容忍導入錯誤的數據條數,輸入數據中的格式錯誤被視爲錯誤,默認值爲1000。

--skip-bad-relationships <true/false>:導入是否跳過缺失節點編號的關係,即關係中未指定開始或結束節點編號,默認跳過,值爲true。

--skip-duplicate-nodes <true/false>:是否跳過導入相同編號的節點。默認值:false。

--ignore-extra-columns <true/false>:是否忽略標題中未指定的額外數據列,默認值:false。

--db-config <path/to/neo4j.conf>:(高級選項)指定數據庫特定配置的文件路徑。與導入工具相關的配置參數有三個,分別爲:dbms.relationship_grouping_threshold、unsupported.dbms.block_size.strings、unsupported.dbms.block_size.array_properties。

      調用導入工具在某些情況下,可能引發意外錯誤,可以帶上--stacktrace參數打印錯誤信息,以利於開發和調試。在導入進行過程中,控制檯上還將輸出相關的統計數據,輸出內容可分成幾個部分,輸出越寬,則導入消耗的時間越多,最寬的部分可認爲是瓶頸,用*標記。如果有雙行,而不是單行,則表明多線程運行。最右邊顯示一個數字,指出該階段處理的實體(節點或關係)數量。例如:

[*>:20,25 MB/s----------|PREPARE(3)=========|RELATIONSHIP(2)=========] 16M

上例中>正在讀取解析數據,速度爲2025 MB/s;PREPARE爲準備數據;RELATIONSHIP爲創建實際關係記錄;v表示正在寫入的要存儲的關係,該步驟在這個例子中沒有顯示,是因爲這一步所花時間相對於其它步驟而言要少得多。通過輸出的信息可以改善數據庫系統的性能,上例中,瓶頸是在數據讀取部分(用>標記處),這可能表明:磁盤速度較慢,或系統在導入數據的同時還在進行讀寫操作。

二、LOAD CSV 導入

LOAD CSV用於從CSV文件中導入數據。

  1. CSV文件的URL可以由FROM後面緊跟的任意表達式來指定。
  2. 需要使用AS來爲CSV數據指定一個變量
  3. LOAD CSV支持以gzip,Deflate和ZIP壓縮的資源
  4. CSV文件可以存在數據庫服務器上,通過file:///URL來訪問。LOAD CSV也支持通過HTTPS、HTTP和FTP來訪問CSV文件。
  5. LOAD CSV支持HTTP重定向,但基於安全考慮,重定向時不能改變協議類型,比如從HTTPS重定向到HTTP。

文件URL的配置項

dbms.security.allow_csv_import_from_file_urls[1]

這個選項決定Cypher在使用LOAD CSV時是否支持使用fille:/// URL來加載數據。該URL唯一標識了數據庫服務器文件系統上的文件。dbms.security.allow_csv_import_from_file_urls=false將完全禁止LOAD CSV訪問文件系統。

dbms.directories.import[2]

設置LOAD CSV中file:/// URL中的根路徑。這必須設置爲數據庫服務器上的文件系統的單個目錄,它讓所有的請求從file:/// URL加載時都使用根路徑的相對路徑(類似unix下的chroot操作)。默認值是import,這是基於安全考慮阻止數據庫訪問標準的import之外的目錄下的文件。將dbms.directories.import設置爲空將移除這個安全考慮,允許訪問系統上的任何文件,但是不推薦這麼做。

文件URLs將相對於dbms.directories.import來解析。例如,一個典型的URL類似file:///myfile.csv或者file:///myproject/myfile.csv。

  1. 如果dbms.directories.import設置的是默認值import,那麼在LOAD CSV語句將分別從<NEO4J_HOME>/import/myfile.csv和<NEO4J_HOME>/import/myproject/myfile.csv中讀取數據。
  2. 如果設置爲/data/csv,上面的LOAD CSV中的URL將分別從/data/csv/myfile.csv和/data/csv/myproject/myfile.csv中讀取數據。

從本地文件導入

LOAD CSV FROM ' file:///artists.csv' AS line

CREATE (:Artist { name: line[1], year: toInt(line[2])})

HTTP導入

LOAD CSV FROM ' http://neo4j.com/docs/developer-manual/3.1/csv/artists.csv' AS line

CREATE (:Artist { name: line[1], year: toInt(line[2])})

CSV文件格式

使用LOAD CSV導入的CSV文件必須滿足如下要求:

  1. 字符編碼爲UTF-8;
  2. 行結束符與操作系統關聯,如unix上爲\n,windows上爲\r\n;
  3. 默認的字段終止符爲,;
  4. 字段終止符可以使用LOAD CSV中 的FIELDTERMINATOR選項來修改。
  5. CSV文件允許引號字符串,但讀取數據的時候引號字符會被丟棄。
  6. 字符串的引號字符爲雙引號"。
  7. 轉義字符爲\。

從CSV文件導入數據

從CSV文件導入數據到Neo4j,可以用LOAD CSV把數據加載到查詢語句中。然後使用正常的Cypher更新語句將數據寫入到數據庫中。

artists.csv

"1","ABBA","1992"

"2","Roxette","1986"

"3","Europe","1979"

"4","The Cardigans","1992"

LOAD CSV FROM ' http://neo4j.com/docs/developer-manual/3.1/csv/artists.csv' AS line

CREATE (:Artist { name: line[1], year: toInt(line[2])})

CSV文件中的每一行都創建一個標籤爲Artist的節點。CSV文件中的另外兩列分別設置爲節點的屬性。

同時創建節點和關係

LOAD CSV FROM ' http://neo4j.com/docs/developer-manual/3.1/csv/artists.csv' AS line

CREATE (n:Artist { name: line[1], year: toInt(line[2])}), (n:Artist { name: line[1], year: toInt(line[2])})

CREATE (n)-[r: line[1]]->(m)

導入包含文件頭的CSV文件

當導入的CSV文件包含文件頭時,可以把每一行看作一個map,而不是字符串數組。

artists.csv

"Id","Name","Year"

"1","ABBA","1992"

"2","Roxette","1986"

"3","Europe","1979"

"4","The Cardigans","1992"

LOAD CSV WITH HEADERS FROM 'http://neo4j.com/docs/developer-manual/3.1/csv/artists-with-headers.csv' AS line

CREATE (:Artist { name: line.Name, year: toInt(line.Year)})

這時,文件的開始行包含列的名稱。指定WITH HEADERS後,可以通過對應的列名來訪問指定的字段。

導入自定義分隔符的CSV文件

CSV文件的分隔符有時候不是逗號,而是其他分隔符。這時,可以使用FIELDTERMINATOR來指定。

artists-fieldterminator.csv

"1";"ABBA";"1992"

"2";"Roxette";"1986"

"3";"Europe";"1979"

"4";"The Cardigans";"1992"

LOAD CSV FROM 'http://neo4j.com/docs/developer-manual/3.1/csv/artists-fieldterminator.csv' AS line FIELDTERMINATOR ';'

CREATE (:Artist { name: line[1], year: toInt(line[2])})

本例中字段之間以分號分隔,因此,在LOAD CSV中使用了FIELDTERMINATOR自定義分隔符。

導入巨量數據

如果導入的CSV文件包含百萬數量級的行,可以使用USING PERIODIC COMMIT來指導Neo4j每導入一定數量行之後就提交(commit)一次。這樣可避免在事務過程中耗費大量的內存。默認情況下,每1000行會提交一次。

USING PERIODIC COMMIT

LOAD CSV FROM 'http://neo4j.com/docs/developer-manual/3.1/csv/artists.csv' AS line

CREATE (:Artist { name: line[1], year: toInt(line[2])})

設置提交頻率

可以設置提交的頻率,如本例中設置爲500行。

USING PERIODIC COMMIT 500

LOAD CSV FROM 'http://neo4j.com/docs/developer-manual/3.1/csv/artists.csv' AS line

CREATE (:Artist { name: line[1], year: toInt(line[2])})

導入包含轉義字符的數據

本例中同時包含了引用字符和轉義字符。

artists-with-escaped-char.csv

"1","The ""Symbol""","1992"

LOAD CSV FROM 'http://neo4j.com/docs/developer-manual/3.1/csv/artists-with-escaped-char.csv' AS line

CREATE (a:Artist { name: line[1], year: toInt(line[2])})

RETURN a.name AS name, a.year AS year, length(a.name) AS length

注意:這裏的字符串用雙引號括起來。同時,關注本例中字符串的長度

三、導出

導出文件的方式:

  1. 使用web控制檯上的 導出csv 功能
  2. 使用neo4j-apoc-procedures導出csv 文件
  3. 使用neo4j-apoc-procedures導出Cypher 創建語句

3.1、neo4j-apoc-procedures 安裝

neo4j-apoc-procedures文檔:https://neo4j-contrib.github.io/neo4j-apoc-procedures/

使用neo4j-apoc-procedures步驟:

1、下載與Neo4j相應版本的jar包:https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases

2、把jar包放在安裝目錄的plugins文件夾下

3、在配置文件neo4j.conf裏添加

apoc.export.file.enabled=true

apoc.import.file.enabled=true

dbms.security.procedures.unrestricted=apoc.*

4、重啓Neo4j服務

 

5、在可視化界面運行:return apoc.version(),如果出現對應的版本號,證明安裝成功

 

3.2、使用neo4j-apoc-procedures導出csv 文件

導出csv文件

call apoc.export.csv.query("MATCH (n)-[r]-(m) return n,r,m","d:/movie.csv",{format:'plain',cypherFormat:'updateStructure'})

3.3、使用neo4j-apoc-procedures導出Cypher 創建語句

導出Cypher 語句

call apoc.export.cypher.query("MATCH (n)-[r]-(m) return n,r,m","d:/movie.cypher")

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章