我有标签 TypeA 的节点,它有一个字符串属性 propA。 propA 是一个字符串 JSON,可以使用 apoc.convert.fromJsonMap() 转换为地图。
我想创建 TypeB 的新节点,其属性为 propA 并在两个节点之间创建关系。我已成功运行以下查询:
MATCH (n:TypeA)
WITH apoc.convert.fromJsonMap(n.propA) AS values,n limit 1
MERGE (v:TypeB)
SET v=values
WITH n,v
MERGE (v)-[:RELATION_TYPE]->(n)
RETURN v,n;
但是,当我将以下内容与 apoc.periodic.iterate 一起使用来转换整个数据库时,它会抛出错误。我运行的查询:
CALL apoc.periodic.iterate(
"MATCH (n:TypeA) RETURN n;",
"WITH apoc.convert.fromJsonMap(n.propA) AS values, n
MERGE (v:TypeB)
SET v=values
WITH n,v
MERGE (v)-[:RELATION_TYPE]->(n)
RETURN v,n;
",
{batchSize:10000, parallel: false});
错误:
{
"Expected ReferenceFromSlot(2) to be a map, but it was :`NO_VALUE`": 4382
}
非常感谢任何帮助。
您的
propA
JSON 值显然存在问题。要分配(节点或关系的)所有属性值,源数据必须是映射(并且每个属性值必须具有一致类型)。检查您的所有 propA
值是否与 neo4j 要求兼容。
此外,您还有另一个严重的问题。您当前的代码不会为每个唯一的
TypeB
地图创建新的 values
节点。这是因为 MERGE (v:TypeB)
会找到 any TypeB
节点并绑定到它。单独的 SET v=values
子句在找到 TypeB
节点之后执行(仅当数据库还没有 TypeB
节点时才会首先创建)。为了执行您想要的操作,propA
JSON 需要一个唯一的标识符属性。我假设它的名字是
id
。如果这是真的,那么您应该将 MERGE (v:TypeB)
更改为 MERGE (v:TypeB {id: values.id})
。