2016-09-28 60 views
2

我試圖創建一個使用Cypher支架通過傳遞性能參數爲UNWIND功能的一部分,Neo4j的多個節點的時候,但我一直收到錯誤Type mismatch: expected Collection<T> but was MapNeo4j的預期集合<T>但圖創建多個節點

使用從Neo4j的文檔(link)下面的例子中,當發生這種情況甚至:

UNWIND { 
    props : [ { 
    name : "Andres", 
    position : "Developer" 
    }, { 
    name : "Michael", 
    position : "Developer" 
    } ] 
} AS map 
CREATE (n) 
SET n = map 

任何人都可以指出我在做什麼錯在這裏?

請注意,上面的示例與Neo4j文檔中的不完全相同。他們的例子包在雙引號中的屬性名稱,但這會導致我的Neo4j的情況下拋出錯誤Invalid input '"': expected whitespace...

回答

4

UNWIND期待的集合,而不是一個地圖中你目前傳遞,試試這個,而不是(剛拆除包裝大括號和支撐頂層場):

UNWIND [ { 
    name : "Andres", 
    position : "Developer" 
    }, { 
    name : "Michael", 
    position : "Developer" 
    } ] AS map 
CREATE (n) 
SET n = map 
2

克里斯的答案當然是正確的,但在這裏就是爲什麼當你的文檔以下解決方案不起作用:你複製documentation

文檔顯示使用命名參數:

UNWIND { props } AS map 
CREATE (n) 
SET n = map 

props在參數映射通過,這將是這樣的:

{ 
    "props" : [ { 
    "name" : "Andres", 
    "position" : "Developer" 
    }, { 
    "name" : "Michael", 
    "position" : "Developer" 
    } ] 
} 

如果顯示在地圖的JSON。這意味着{props}佔位符將替換爲props密鑰。這正是Chris所做的。

這裏的Java代碼是什麼樣子:

GraphDatabaseService db = /* init */; 
Map<String, Object> andres = new HashMap<>(); 
andres.put("name", "Andres"); 
andres.put("position", "Developer"); 
Map<String, Object> michael = new HashMap<>(); 
michael.put("name", "Michael"); 
michael.put("position", "Developer"); 
Map<String, Object> params = new HashMap<>(); 
params.put("props", Arrays.asList(andres, michael)); 
try (Transaction tx = db.beginTx()) { 
    db.execute("UNWIND {props} AS map CREATE (n) SET n = map", params); 
    tx.success(); 
} 
+0

太好了,謝謝你的解釋 –