我有一個2遞歸字段PersonID和FollowPersonID的表,存儲所有人之間的關係(人1跟隨人2,人2跟隨人1),我想提取並創建neo4J相關的網絡。是否有捷徑可尋?如何將SQL遞歸層次關係錶轉換爲Neo4j?
回答
該表格(我稱之爲「Follows」)可以變成兩個Person
節點之間的關係FOLLOWS
。
你應該可以使用一些APOC procedures for loading using JDBC來幫助你做到這一點。
下面是一個例子:
CALL apoc.load.driver("com.mysql.jdbc.Driver")
CALL apoc.load.jdbc("jdbc:mysql://localhost:3306/mydb?user=root", "Follows") YIELD row
MATCH (p1:Person {id: row.PersonId}), (p2:Person {id: row.FollowPersonId})
MERGE (p1)-[:FOLLOWS]->(p2);
如果該表是大的(或者有很多Person
節點),這也將是有意義的首先創建一個索引(或唯一約束)上Person(id)
到加快導入:
CREATE INDEX ON :Person(id);
如果創建索引,這種形式的查詢應確保使用索引(見this other answer一些更多細節):
CALL apoc.load.driver("com.mysql.jdbc.Driver")
CALL apoc.load.jdbc("jdbc:mysql://localhost:3306/mydb?user=root", "Follows") YIELD row
WITH row.PersonId AS id1, row.FollowPersonId AS id2
MATCH (p1:Person {id: id1}), (p2:Person {id: id2})
USING INDEX p1:Person(id)
USING INDEX p2:Person(id)
MERGE (p1)-[:FOLLOWS]->(p2);
如果您正在尋找各種方法來連接到數據庫,那麼你可以使用APOC與以下步驟
CALL apoc.load.driver('your_jdbc_driver');
CALL apoc.load.jdbc(url, 'SELECT PersonID, FollowPersonID FROM PersonFollow;')
連接和檢索數據,例如,然後你就可以創建所有的節點和關係,如果你使用MERGE。例如像這樣:
CREATE CONSTRAINT ON (p:Person) ASSERT p.PersonID IS UNIQUE;
with "your_jdbc_url" as url
CALL apoc.load.jdbc(url, 'SELECT PersonID, FollowPersonID
FROM PersonFollow;') YIELD row
MERGE (p:Person {PersonID:row.PersonID})
MERGE (f:Person {PersonID:row.FollowPersonID})
CREATE (p)-[:FOLLOWS]->(f)
MERGE允許有也執行不同的操作創建和匹配,所以它可以設置其他屬性值,根據節點的存在,或者如果它是一個新的節點
感謝您的回答。我直接從一個文件中嘗試,它可以用於幾行... 但是當我在文件中有很多行時,它開始思考和思考。 不知道我知道如何從文件創建索引? - 我真的很新。 從'file:/// C:\\ collab1.csv'載入CSV文件作爲行 MERGE(p:Person {PersonId:row.EntityID}) MERGE(f:Person {PersonID:row.ownerEntityID, EnterpriseID:row.EnterpriseId}) CREATE(p) - [:FOLLOWS] - >(f) –
Direct Neo4j提交部分數據。在加載CSV之前放置使用定期提交。更重要的是始終使用節點標籤,關係類型和屬性名稱 - 它們區分大小寫! PersonID和PersonId是不同的!你認爲你的數據集中PersonId是唯一的嗎?如果是的話,像我之前的答案一樣創建約束。在加載語句前執行此操作。另外,MERGE正在尋找您指定的所有屬性。你的第一個MERGE試圖通過PersonId找到Person,第二個試圖找到具有2個屬性(PersonID和EnterpriseID)的Person。那是你正在嘗試做什麼? – Vardan
不知道你的數據很難猜到,但這裏有一個例子: – Vardan
- 1. 將XSD轉換爲SQL關係表
- 2. 如何將XML的嵌套層次結構轉換爲SQL表
- 3. SQL遞歸層次結構
- 4. 將遞歸轉換爲'tail遞歸'
- 5. 如何將遞歸轉換爲摺疊
- 6. 如何將循環轉換爲遞歸?
- 7. 將SQL轉換爲關係代數時,如何表示符號*?
- 8. 如何在本例中將遞歸轉換爲尾遞歸?
- 9. 如何將遞歸方法轉換爲java中的非遞歸
- 10. 遞歸關係SQL錯誤
- 11. 將SQL查詢轉換爲ActiveRecord關係
- 12. 將SQL轉換爲關係代數
- 13. 將錶轉換爲關係表
- 14. 遞歸cte sql與層次級別
- 15. SQL計算列,遞歸總結層次
- 16. 如何將列表轉換爲層次結構dict
- 17. 如何將列表轉換爲樹使用遞歸
- 18. 如何遞歸地將列表轉換爲BSTree?
- 19. 將一系列父子關係轉換爲分層樹?
- 20. 如何遞歸總結父/子層次
- 21. 如何層次列表轉換成JSON
- 22. 如何將多層嵌套的JSON轉換爲SQL表格
- 23. 將ER關係圖中的關係屬性轉換爲SQL
- 24. 將關係代數關係轉換爲SQL(INTERSECT)?
- 25. 轉換爲循環...遞歸遞歸
- 26. 如何將Sql命令轉換爲關係代數?
- 27. 如何將關係(具有屬性)轉換爲關係模式/ sql?
- 28. 將此層次轉換爲xml?困惑
- 29. 將enum轉換爲類層次結構
- 30. 將遞歸算法轉換爲迭代
從你之前對另一個問題的回答可知,MATCH不能使用索引進行查找嗎?你不需要將行屬性別名到他們自己的值來利用索引嗎? – InverseFalcon
:-)讓我檢查一下... – cybersam
我更新了其他[答](http://stackoverflow.com/a/40897104/974731)與更多信息。我的答案*中的查詢可能會導致規劃者使用一個或兩個'MATCH'模式的索引。但目前似乎有一個錯誤,它會阻止您指定'USING INDEX'提示,除非您使用我的其他答案中提到的解決方法。 – cybersam