2016-12-05 85 views
0

我有以下的用戶CSV:Neo4j的創建重複的節點

email,ip 
[email protected],73.53.30.159 
[email protected],1.2.3.4 
[email protected],1.1.1.1 

而下面的IPS CSV:

ip 
73.53.30.159 
1.1.1.1 

進出口使用創建2節點類型:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///ips2.csv" AS row 
CREATE (:IP {ip: row.ip}); 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///ips2.csv" AS row 
CREATE (:IP {ip: row.ip}); 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///emails.csv" AS row 
CREATE (:A1USER {email: row.email, ip: row.ip}); 

的話,我想創建一個給定的IP到相應的IP節點的用戶之間的連接:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///emails.csv" AS row 
MATCH (u:USER {email: row.email, ip:row.ip}) 
MATCH (ip:IP {ip: row.ip}) 
MERGE (ip)-[:ACCESSED]->(u); 

然而,在我的例子中,「[email protected]」正在創建兩次,一次訪問1.1.1.1,訪問73.53.30.159。 我期待「[email protected]」節點創建一次,有兩個傳入的關係,一個從1.1.1.1,一個來自73.53.30.159。

我應該如何着手呢? 謝謝。

+1

在您的「創建2種節點類型」查詢,您是從同一個加載CSV文件兩次,還創建兩次相同節點類型的實例。這是一個錯字,還是這是你的實際查詢? – cybersam

回答

1

在導入文件,如果相同的數據可能會出現不止一次,使用合併而不是創造時,你的節點。

我假設你有獨特的約束:IP(IP)和:IP9(IP)?您需要一個唯一的約束或索引:USER(電子郵件),具體取決於多個用戶是否可以使用相同的電子郵件。

+0

在我的導入文件中,同一封電子郵件可能會發生多次。我嘗試用MERGE替換CREATE,但仍然使用相同的電子郵件獲取重複的節點。 – Raytracer

+0

是的,我對用戶(電子郵件)上的IP(ip)和INDEX有獨特的約束。 – Raytracer

+0

重複的節點是否真的重複?還是有其他財產差異?另外,我注意到你正在使用:USER和:A1USER節點,是具有這些標籤的節點之間的重複,還是隻在一個標籤或另一個標籤中? – InverseFalcon

1

您的用戶CSV包含重複的電子郵件地址,用不同的IP地址:它沒有意義存儲IP地址作爲節點屬性,因爲有幾個人,你要創建與關係無論如何,這個節點都是IP

只需先創建IP節點,然後直接在USER節點在創建連接(只從電子郵件地址):

CREATE CONSTRAINT ON (n:IP) ASSERT n.ip IS UNIQUE; 
CREATE CONSTRAINT ON (n:USER) ASSERT n.email IS UNIQUE; 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///ips2.csv" AS row 
CREATE (:IP {ip: row.ip}); 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///emails.csv" AS row 
// Merge on the "primary key" only 
MERGE (u:USER {email: row.email}) 
WITH row, u 
MATCH (ip:IP {ip: row.ip}) 
MERGE (ip)-[:ACCESSED]->(u);