我需要在Neo4j中創建一個二叉樹。我已經開始創建兩個CSV,一個用於頂點,一個用於邊緣,然後我啓動了兩個查詢來創建整個樹。從CSV加載創建二叉樹
我認爲我可以創建只有一個查詢整個樹。 從我開始在CSV是這樣的:
"parent","child_1","child_1_attr1","child_1_attr2","edge_1_attr1","edge_1_attr2","child_2","child_2_attr1","child_2_attr2","edge_2_attr1","edge_2_attr2"
"vertex_1","vertex_2","2","5","4","1","vertex_3","5","3","2","2"
"vertex_2","vertex_4","3","5","2","3","vertex_5","4","4","4","3"
"vertex_3","vertex_6","2","1","2","4","vertex_7","2","2","5","5"
"vertex_4","vertex_8","4","4","4","5","vertex_9","2","3","2","5"
"vertex_5","vertex_10","1","1","3","3","vertex_11","1","3","2","3"
"vertex_6","vertex_12","3","1","1","1","vertex_13","1","2","5","1"
"vertex_7","vertex_14","4","2","2","1","vertex_15","2","5","4","3"
然後我嘗試此查詢:
LOAD CSV WITH HEADERS FROM 'file:///Prova1.csv' AS line
Match (p:Vertex {name: line.parent})
Create (c1:Vertex {name: line.child_1, attr1: line.child_1_attr1, attr2: line.child_1_attr2})
Create (c2:Vertex {name: line.child_2, attr1: line.child_2_attr1, attr2: line.child_2_attr2})
Create (p)<-[:EDGE {attr1: line.edge_1_attr1, attr2: line.edge_1_attr2}]-(c1)
Create (p)<-[:EDGE {attr1: line.edge_2_attr1, attr2: line.edge_2_attr2}]-(c2)
此查詢我手動創建的第一個頂點之前,和我運行此查詢,但只結果是我得到的是Vertices 1,2和3的創建。 它應該匹配父(始終已經創建),然後創建兩個孩子,然後它應該將這兩個孩子連接到他的父親。
誰能幫幫我?
首先,感謝對Cypher代碼執行的詳細解釋,這是非常有用的,因爲我正在通過我自己的Neo4j學習大學項目很難找到像這樣簡單的解釋。 –
順便說一句,前幾天我設法創建一個單一的查詢樹和像這樣的小的,它的工作原理。事實是,我需要管理至少有2百萬個節點的樹,並且我正在考慮使用這種方法來改進創建帶有2個CSV(一個用於節點,一個用於邊)的2M節點樹,在這種情況下需要300秒(在通用筆記本電腦上使用 '使用定期COMMIT')。 你認爲用你的查詢'使用週期性提交'會起作用嗎?而且,你認爲這個查詢實際上可以縮短創建時間嗎? –
使用週期性COMMIT應該可以提高導入性能,並且您絕對需要一個唯一的約束:頂點(名稱)(或者至少一個索引,如果名稱不是唯一的頂點)。如果使用2個CSV,其中一個用於節點,另一個用於邊緣,則可以在關係CSV中的頂點上自由使用MATCH而不是MERGE,並且可以在節點之間自行創建CREATE,這應該有助於提高性能。 – InverseFalcon