2016-11-18 65 views
0

我正在與我的大學做一些事情,並且我被要求創建一個系統來構建包含數百萬個節點的完整樹(至少有1百萬或2百萬個) 。 我正在嘗試使用加載CSV創建樹使用定期提交,它與創建僅Nodes(通用筆記本上的70000毫秒:P)一起工作良好。當我嘗試與邊緣相同時,它也沒有縮放。在Neo4j 3.0.4中創建/管理數百萬頂點樹

Using periodic commit LOAD CSV WITH HEADERS FROM 'file:///Archi.csv' AS line 
Merge (:Vertex {name:line.from})<-[:EDGE {attr1: toFloat(line.attr1), attr2:toFloat(line.attr2), attr3: toFloat(line.attr3), attr4: toFloat(line.attr4), attr5: toFloat(line.attr5)}]-(:Vertex {name:line.to}) 

我需要保證在不超過5分鐘內生成樹。

有更快的方法可以返回這樣的表演嗎?

P.S. :這個任務並不期望使用Neo4j,而只是一個數據庫(SQL或NoSQL),但是我發現這個NoSQL圖形數據庫,我認爲使用Neo4j可以很好地實現,因爲圖形數據結構是免費的。

P.P.S:我使用的Cypher

回答

1

我想你應該重新閱讀了關於開發者文檔中MERGE,以確保您準確理解它在做什麼。

特別是有幾件事情要注意的......

如果合併不存在的模式,該模式中的所有元素將被合併,這可能會導致重複:創建頂點節點。如果您的頂點應該已經在數據庫中,並且沒有任何關係,並且您確定CSV中沒有任何關係可以重複,我強烈建議您在開始和結束節點上進行匹配,然後創建它們之間的關係而不是MERGE。請記住,對具有許多屬性的關係進行MERGE意味着它會嘗試首先匹配,因此隨着節點間關係數量的增加,會有越來越多的比較,這會進一步減慢查詢速度。如果你知道沒有關係會被複制,並且你確定這些關係還不存在,CREATE是一個更好的選擇。

我還敦促你創建一個索引:頂點(名稱),因爲這將顯着幫助在端節點上進行匹配。

+0

首先,感謝您的幫助。我有一個問題可能會讓你發笑.-。 :模式索引如何工作以及它們如何改進我的查詢? –

+0

以下是開發人員文檔中的[模式部分](https://neo4j.com/docs/developer-manual/current/cypher/#cypher-schema)。通常,您將在具有特定標籤的節點屬性上創建唯一約束或模式索引,以便在使用該屬性查找具有該標籤的節點時提高性能。通過在頂點(名稱)上創建索引,按以下方式查找:按名稱查找頂點節點(例如,爲了在這些節點之間建立關係而匹配這些節點時)使用引擎蓋下的索引快速查找。否則,它必須通過名稱屬性掃描所有頂點節點。 – InverseFalcon

+0

超級進口商的方法呢?該文檔說,這個工具是你需要的巨大數據集結構爲CSV,但我找不到這個工具。工具位於「path/to/neo4j/bin/neo4j-import」,該文檔說,但我無法設法調用它。我正在使用neo4j 3.0.4 –