Neo4j期望Collection <t>,但在创建多个节点时是Map

时间:2016-09-28 19:49:55

标签: neo4j cypher

我正在尝试使用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...

2 个答案:

答案 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();
}