2016-03-25 35 views
1

我想將項目從SQL圖形數據庫'模擬'遷移到neo4j,現在我卡住了。我有一個包含100000+行表格source_id,relationship_type,target_id的表格。 以下是進口聲明:將變量用於從csv導入時的關係

LOAD CSV WITH HEADERS FROM 
'file:///usr/local/n4jinput/special_semrelations.csv' AS line 
WITH line 
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)}) 
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)}) 
CREATE (s)-[line.rlt_relation]->(t) 

問題出在create語句中。什麼是檢索[:WHATEVER_IS_IN_THE_CSV]的正確語法?因爲我有幾十種關係類型,所以我需要在這裏使用某種變量......如果這在CYPHER中是不可能的,那麼有沒有其他方法可以高效地完成此操作?

+0

謝謝你的提示,cybersam,答案是原則上的確如此,儘管這個問題聽起來不同於第一眼... – cip22

回答

1

關係類型不能在Cypher中進行參數設置或動態指定。如果您有一組定義的關係類型,則有一種解決方法。您可以使用CASE語句比較關係類型,填充一個數組,如果關係類型相匹配,然後通過創建正確的關係類型數組(S)迭代:

LOAD CSV WITH HEADERS FROM 'file:///myfile.csv' AS line 
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)}) 
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)}) 
WITH s,t, 
    CASE WHEN line.rlt_relation = "MEMBER_OF" THEN [1] ELSE [] END AS member_of, 
    CASE WHEN line.rlt_relation = "BELONGS_TO" THEN [1] ELSE [] END AS belongs_to 
FOREACH (x IN member_of | CREATE (s)-[:MEMBER_OF]->(t)) 
FOREACH (x IN belongs_to | CREATE (s)-[:BELONGS_TO]->(t)) 
+0

感謝您的回覆和解決方法。我會嘗試的。順便說一句,是否由於技術原因,關係類型不能在Cypher中動態指定,還是要強制實施某種工作流程或建模習慣? – cip22

+0

我相信原因與生成查詢計劃的過程有關。每個Cypher查詢都被編譯成一個執行計劃,然後這個執行計劃被緩存,所以下一次看到查詢時計劃可以被重用。但是,如果關係類型或節點標籤被參數化,則查詢計劃不能被緩存(因爲執行計劃可以隨關係類型/節點標籤而改變)。 –

+0

作品很有魅力,謝謝! – cip22