2016-04-14 146 views
0

我從SQL Server中導出了兩個名爲Keys和Acc表的CSV表格作爲CSV文件,並使用以下命令將它們成功導入到Neo4J。根據條件克隆一些關係

CREATE INDEX ON :Keys(IdKey) 

USING PERIODIC COMMIT 500 
LOAD CSV FROM 'file:///C:/Keys.txt' AS line 
MERGE (k:Keys { IdKey: line[0] }) 
SET k.KeyNam=line[1], k.KeyLib=line[2], k.KeyTyp=line[3], k.KeySubTyp=line[4] 

USING PERIODIC COMMIT 500 
LOAD CSV FROM 'file:///C:/Acc.txt' AS line 
MERGE (callerObject:Keys { IdKey : line[0] }) 
MERGE (calledObject:Keys { IdKey : line[1] }) 
MERGE (callerObject)-[rc:CALLS]->(calledObject) 
SET rc.AccKnd=line[2], rc.Prop=line[3] 

Keys代表源代碼對象,Acc代表它們之間的關係。我爲三個不同的應用程序項目導入了這兩個表格三次。因此,爲了保持IdKey屬性對於三個應用程序是唯一的,我將一個五個字符的前綴與IdKey連接起來,以便在從sql server導出時標識應用程序對象,因爲我無法像從手冊中學到的那樣根據多個字段創建索引。現在我的目標是構建應用程序之間的關係。例如:

  • 節點1是應用1
  • 節點2的源代碼的對象是應用程序1的另一個源代碼對象
  • 節點3是應用2的源代碼的對象

已經有一個CALL由於已導入的Acc中的記錄,從節點1創建到節點2的關係。 Node2的名稱等於Node3的名稱。所以我們可以說Node2和Node3實際上是相同的源代碼。所以我們應該創建一個從Node1到Node3的關係。爲了實現它,我在下面寫了一個命令。但我想確定它是正確的。因爲我不知道它會執行多久。

MATCH (caller:Keys)-[rel:CALLS]->(called:Keys),(calledNew:Keys) 
WHERE calledNew.KeyNam = called.KeyNam 
and calledNew.IdKey <> called.IdKey 
CREATE (caller)-[:CALLS]->(calledNew) 

回答

0

這下面的查詢應該是有效的,假設你也create an index:Keys(KeyNam)

MATCH (caller:Keys)-[rel:CALLS]->(called:Keys) 
WITH caller, COLLECT(called.KeyNam) AS names 
MATCH (calledNew:Keys) 
WHERE calledNew.KeyNam IN names AND NOT (caller)-[:CALLS]->(calledNew) 
CREATE (caller)-[:CALLS]->(calledNew) 

當直接在屬性值之間進行比較時,Cypher不會使用索引。因此,此查詢將每個caller的所有called名稱放入names集合中,然後在calledNew.KeyNam與該集合中的項目之間進行比較。這會導致索引被使用,並會加速識別潛在的重複被叫節點。

此查詢還執行NOT (caller)-[:CALLS]->(calledNew)檢查,以避免在相同節點之間創建重複關係。