2016-11-30 45 views

回答

0

該表格(我稱之爲「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); 
+0

從你之前對另一個問題的回答可知,MATCH不能使用索引進行查找嗎?你不需要將行屬性別名到他們自己的值來利用索引嗎? – InverseFalcon

+0

:-)讓我檢查一下... – cybersam

+1

我更新了其他[答](http://stackoverflow.com/a/40897104/974731)與更多信息。我的答案*中的查詢可能會導致規劃者使用一個或兩個'MATCH'模式的索引。但目前似乎有一個錯誤,它會阻止您指定'USING INDEX'提示,除非您使用我的其他答案中提到的解決方法。 – cybersam

0

如果您正在尋找各種方法來連接到數據庫,那麼你可以使用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允許有也執行不同的操作創建和匹配,所以它可以設置其他屬性值,根據節點的存在,或者如果它是一個新的節點

+0

感謝您的回答。我直接從一個文件中嘗試,它可以用於幾行... 但是當我在文件中有很多行時,它開始思考和思考。 不知道我知道如何從文件創建索引? - 我真的很新。 從'file:/// C:\\ collab1.csv'載入CSV文件作爲行 MERGE(p:Person {PersonId:row.EntityID}) MERGE(f:Person {PersonID:row.ownerEntityID, EnterpriseID:row.EnterpriseId}) CREATE(p) - [:FOLLOWS] - >(f) –

+0

Direct Neo4j提交部分數據。在加載CSV之前放置使用定期提交。更重要的是始終使用節點標籤,關係類型和屬性名稱 - 它們區分大小寫! PersonID和PersonId是不同的!你認爲你的數據集中PersonId是唯一的嗎?如果是的話,像我之前的答案一樣創建約束。在加載語句前執行此操作。另外,MERGE正在尋找您指定的所有屬性。你的第一個MERGE試圖通過PersonId找到Person,第二個試圖找到具有2個屬性(PersonID和EnterpriseID)的Person。那是你正在嘗試做什麼? – Vardan

+0

不知道你的數據很難猜到,但這裏有一個例子: – Vardan