2017-01-25 106 views
0

爲了測試目的,我將數據從另一個數據源導入neo4j。 我只將數據作爲節點導入。現在我想根據導入的ID添加邊緣。每個節點具有2個字段性能:根據屬性ID在neo4j中創建關係

  • ID:包含識別作爲字符串
  • :包含所有連接爲一個字符串[]

對於性能改進我還創建了一個指數爲propertiy「ID 「和屬性索引」

首先我創建了兩個屬性作爲字符串(從列表作爲逗號分隔字符串)。

這工作,但實在是太慢了:

MATCH (e:Test1),(r:Test2) 
WHERE r.from CONTAINS e._id 
MERGE (e)-[:HAS]->(r) 

有沒有更好的辦法?

PS:我也嘗試將字段存儲爲String []。比我用下面的查詢

MATCH (e:Test1),(r:Test2) 
WHERE e._id IN r.from 
MERGE (e)-[:HAS]->(r) 

- >性能是一樣的

回答

1

的問題是,你把所有組件的組合 - 笛卡爾乘積。在這兩種情況下。更多的將split the string by comma標識符更好。例如:

MATCH (T2:Test2) 
UNWIND split(T2.from, ",") as id 
MATCH (T1:Test1) WHERE T1._id = id 
MERGE (T1)-[:HAS]->(T2) 

或者,如果你保持標識符數組中:

MATCH (T2:Test2) 
UNWIND T2.from as id 
MATCH (T1:Test1) WHERE T1._id = id 
MERGE (T1)-[:HAS]->(T2) 

,當然,不要忘了索引。

+0

謝謝。這工作得很好。 – mabr

1

事實上,在導入時,你應該創建:HAS關係而不是創建from屬性(它迫使你做出浪費額外的查詢創建的關係,並給你留下多餘的from性質,你可能會想刪除)。

例如,如果你正在使用LOAD CSV導入,導入文件有test2Idfrom列(字符串,字符串集,分別),該進口查詢應該創建所有的節點和關係:

LOAD CSV WITH HEADERS FROM "file:///input.csv" AS row 
MERGE (t2:Test2 {id: row.test2Id}) 
WITH row, t2 
UNWIND row.from AS t1Id 
MERGE (t1:Test1 {id: t1Id}) 
MERGE (t1)-[:HAS]->(t2); 

爲了獲得更好的性能,您需要:Test1(id):Test2(id)上的索引。

+0

我的用例中的問題是:不確定所有的id/from關係是否對給定的時間有效。數據源沒有事務或有效引用的概念。所以我不得不創建一個「異步」邊緣/節點 – mabr