簡體   English   中英

在neo4j中合並CSV以避免重復

[英]Merge CSV in neo4j avoiding duplicates

我正在使用neo4j和電影的數據集示例。 https://neo4j.com/developer/example-data/

我現在想使用grouplens的CSV文件https://grouplens.org/datasets/movielens/導入和更新數據庫。

如果用csv文件編寫的電影已經在數據庫中,則我想更新(合並)從csv文件檢索的屬性。

如果電影還沒有在數據庫中,我想為此創建一個新記錄。

一個問題是,csv文件中的電影在標題中具有發布年份,而在DB中則沒有條目。 因此,我還需要在csv文件中拆分標題。

我嘗試了這個,但是它確實起作用了:

 USING PERIODIC COMMIT 500
 LOAD CSV WITH HEADERS FROM "File:///movies.csv" AS csvLine 
 Merge (movie:Movie{title:split(csvLine.title,"()")})
 Create (a:Movie{id:csvLine.movieId,genre:csvLine.genres})
 Return a.title

我建議您安裝APOC過程插件,其中包含許多有用的字符串函數來幫助您:

https://github.com/neo4j-contrib/neo4j-apoc-procedures

下載APOC插件並將其復制到$NEO4J_HOME/plugins目錄中

通過添加以下行來啟用neo4j.conf配置文件中的過程

dbms.security.procedures.unrestricted=apoc.*

重新啟動Neo4j。

APOC過程包含一個apoc.text.replace函數,該函數接受一個正則表達式:

WITH "Toy Story (1995)" AS title
RETURN trim(apoc.text.replace(title, "\\([0-9]+\\)",""))


╒═══════════════════════════════════════════════════════════╕
│"trim(apoc.text.replace(title, \"\\\\([0-9]+\\\\)\",\"\"))"│
╞═══════════════════════════════════════════════════════════╡
│"Toy Story"                                                │
└───────────────────────────────────────────────────────────┘

然后,您可以在LOAD CSV語句中使用它:

 USING PERIODIC COMMIT 500
 LOAD CSV WITH HEADERS FROM "File:///movies.csv" AS csvLine 
 MERGE (movie:Movie {title: trim(apoc.text.replace(csvLine.title, "\\([0-9]+\\)","")) })
 CREATE (a:Movie{id:csvLine.movieId,genre:csvLine.genres})
 RETURN a.title

當查詢無法按預期工作時,最好開發一個最小查詢以檢查您的假設並查看出了什么問題。

例如,您可以使用它來測試拆分是否按預期工作:

LOAD CSV WITH HEADERS FROM "File:///movies.csv" AS csvLine 
with csvLine limit 1
return csvLine.title, split(csvLine.title,"()")

您將能夠快速看到拆分未按您預期的那樣運行,此處的多個定界符不起作用,即使它們成功了,您也需要在查詢中做更多的工作才能獲得相關內容的一部分。分割結果。

獲得所需內容的一種方法是在'('周圍進行拆分,獲取結果字符串數組的第一個元素,然后對其進行右修剪以消除任何可能的空格: rTrim(split(csvLine.title, '(')[0])

需要解決的另一件事是在MERGE之后的CREATE子句中找出​​您要執行的操作。 我有一種感覺,您只是想要一個MERGE,然后又想設置值(否則,您將在此處創建兩個單獨的:Movie節點,一個用於標題,另一個用於id和體裁,這沒有意義。 )。

嘗試這個:

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM "File:///movies.csv" AS csvLine 
MERGE (movie:Movie{title: rTrim(split(csvLine.title, '(')[0])})
SET movie.id = toInteger(csvLine.movieId), movie.genres = csvLine.genres

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM