我正在尝试使用Cypher在Neo4j中创建多个节点,方法是将属性作为参数传递给UNWIND
函数,但我一直收到错误Type mismatch: expected Collection<T> but was Map
。
即使使用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...
)
答案 0 :(得分:5)
UNWIND期待一个集合,而不是你当前传入的地图,试试这个(只需删除包裹花括号和道具顶级字段):
LocalStrategy
答案 1 :(得分:2)
克里斯的答案当然是正确的答案,但这就是为什么当您关注文档时,您的解决方案无效的原因:您不是不是复制documentation。
文档显示了命名参数的使用:
UNWIND { props } AS map
CREATE (n)
SET n = map
在参数映射中传递props
,如下所示:
{
"props" : [ {
"name" : "Andres",
"position" : "Developer"
}, {
"name" : "Michael",
"position" : "Developer"
} ]
}
如果您将地图显示为JSON 。这意味着{props}
占位符将替换为props
键的值。这正是克里斯所做的。
这里是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();
}