NEO4J 數據導入,處理,關係,坑

最近有人問過我,每天一篇到底是在做什麼,對知識這樣共享表示不理解,其實我並不知道怎麼回答這個問題,只能回答天性使然,慣性使然,三個字習慣了。

NEO4J 的學習也是由於業務的驅使,並非毫無目的的學習,NEO4J的確是可以解決目前其他數據庫無法快速或簡便解決的問題。

前兩期都是在初級的使用上,本期開始要在數據的導入,以及數據關係的建立,以及索引的建立。

NEO4J 本身有兩種導入數據的方法

1  LOAD CSV 的方式

2  Bulk importer for Large Datasets

這兩種方式之間的不同是導入數據的速度和方式以及對數據庫本身的影響

從靈活性和數據的可修復性來講,LOAD CSV方式是比較被推薦的,而BULK import for large dataset 則是你的數據流太大,並且是初始化的時候可以進行數據的導入。

首先要使用load csv方式導入數據,注意兩層 (以下的操作和配置均是在社區版,社區和企業版有很多的不同功能受限嚴重)

1  系統的配置

需要打開  dbms.security.allow_csv_import_from_file_urls=trun

同時需要設置相關的import

社區版的基本上調節這兩個參數就可以了

2  導入的方式與限流

下面是一個導入數據的語句,數據用逗號分隔,這裏裏面需要注意的是如果你的數據本身就有逗號,這就比較麻煩了,可能需要使用轉移符,但一般如果是做NEO4J 的基礎數據,實在讓我想不到有什麼屬性裏面要帶有逗號。

其中上面的文字是官方文檔對於CSV 的導入數據的提示,數據在導入前,需要進行數據清理。

下面就來說說導入數據中存在的幾個問題

1  怪異的字符,尤其數據中帶有 - -> <- 等數據  其中這些是關係符號等,所以如果後期在查詢中帶有這些符合就需要通過轉移符,或者·· 來規避查詢的失敗,所以早期數據的重新整理是重要的。

2  導入數據時,對NULL 數據要有處理,這裏不希望在帶有NULL 數據,雖然NOE4J 可以允許屬性中帶有NULL。

3  導入大量數據時需要分批的進行commit 具體行數要看你的內存,否則會溢出內存

4  導入數據的字符格式需要UTF-8 

5  dbms.import.csv.legacy_quote_escaping  中如果設置爲true 則 \ 作爲轉移符。

6 字符可以添加“” 雙引號,但在讀取數據時會將其去掉

也可以在導入前先在BROSWER 中看看數據的大概

LOAD CSV FROM "file:/app1.csv" AS line WITH line RETURN line LIMIT 5

下面的方式是導入沒有頁頭的數據,也就是上來第一行就是數據,上面的是10000條提交一次,下面是加載數據文件的名字,最下面的 create 開始就是創建節點

:auto using periodic commit 10000

LOAD CSV FROM "file:/app1.csv" AS line

create (:APPLICATION_ID{APPLICATIONNO:line[0],NAME:line[1],PROVINCES:line[2],CITY:line[3],BUY_PROVINCES:line[4],BUY_CITY:line[5],REGISTRATION_PROVINCES:line[6],REGISTRATION_CITY:line[7],INVOICECOMPANY:line[8],BRAND:line[9],SUBMITDATE:line[10],CAR_TYPE:line[11]})

當然如果有頁頭的話方式就會不同

CREATE INDEX ON:APPLICATION_ID (APPLICATIONNO);

可以根據節點+屬性來對需要查詢的數據進行索引的添加

下面就以一個實例

這邊導入兩個node 的數據,一個是訂單,一個購買人,然後通過關係來反映之間的關係(初級水平)實際上關係可以很複雜,節點可以很多。

節點1  100萬數據 ORDER 訂單   節點名  APPLICATION_ID

節點2  10萬數據  customer 信息  節點名

通過 CSV方式導入數據,沒10000條commit一次

:auto using periodic commit 10000

LOAD CSV WITH HEADERS FROM "file:/app1.csv" AS line

create (:APPLICATION_ID {APPLICATIONNO:line.APPLICATIONNO,NAME:line.NAME,PROVINCES:line.PROVINCES,CITY:line.CITY,BUY_PROVINCES:line.BUY_PROVINCES,BUY_CITY:line.BUY_CITY,REGISTRATION_PROVINCES:line.REGISTRATION_PROVINCES,REGISTRATION_CITY:line.REGISTRATION_CITY,INVOICECOMPANY:line.INVOICECOMPANY,BRAND:line.BRAND,SUBMITDATE:line.SUBMITDATE,CAR_TYPE:line.CAR_TYPE})

:auto using periodic commit 10000

LOAD CSV WITH HEADERS FROM "file:/peop10.csv" AS line

create (:BROWWER_ID {APPLICATIONNO:line.APPLICATIONNO,CNAME:line.CNAME,IDCARD:line.IDCARD,PHONE:line.PHONE})

其中可以通過上的信息看到兩個節點中的APPLICATIONNO 是建立關係的關鍵點。

MATCH p=(a:APPLICATION_ID)-[]-(b:BROWWER_ID)

where a.APPLICATIONNO='GW-A264061000'

return b.IDCARD,a.APPLICATIONNO

通過下面的語句將兩個節點之間的關係進行建立,關係 r_peope_order

MATCH (a:APPLICATION_ID),(b:BROWWER_ID) where a.APPLICATIONNO = b.APPLICATIONNO create (a) - [r:r_people_order] -> (b)

通過查詢語句就可以開始查詢某個訂單和人之間的關係,當然上面的關係臺單純,所以給出的圖也就比較簡單,實際上通過複雜關係的建立,以及業務邏輯的複雜,相關的圖的複雜度就會越來越高。

最後總結,NEO4J 的數據導入的方法不止上面的,還有通過neo4j-admin import更快速的導入的方法,找時間可以繼續,另外在邏輯關係方面還需要繼續深入,至於坑,主要在數據導入初期,對於節點,屬性,關係等問題的清晰度,以及導入數據的中的系統配置例如大部分網上的東西都是基於WINDOWS 所以由於某些誤導,導致初期的數據導入不成功,並且由於數據的格式的問題,也導致多次導入數據的失敗問題。所以不經歷xx,看見彩虹是很難的。

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