Neo4J APOC 定期迭代 - ReferenceFromSlot(2) 是一个映射,但它是:`NO_VALUE`": 4

问题描述 投票:0回答:1

我有标签 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
}

非常感谢任何帮助。

neo4j cypher neo4j-apoc
1个回答
0
投票
  1. 您的

    propA
    JSON 值显然存在问题。要分配(节点或关系的)所有属性值,源数据必须是映射(并且每个属性值必须具有一致类型)。检查您的所有
    propA
    值是否与 neo4j 要求兼容。

  2. 此外,您还有另一个严重的问题。您当前的代码不会为每个唯一的

    TypeB
    地图创建新的
    values
    节点。这是因为
    MERGE (v:TypeB)
    会找到 any
    TypeB
    节点并绑定到它。单独的
    SET v=values
    子句在找到 TypeB 节点之后执行(仅当数据库还没有
    TypeB
    节点时才会首先创建)。
    为了执行您想要的操作,

    propA

    JSON 需要一个唯一的标识符属性。我假设它的名字是

    id
    。如果这是真的,那么您应该将
    MERGE (v:TypeB)
    更改为
    MERGE (v:TypeB {id: values.id})
    
    

© www.soinside.com 2019 - 2024. All rights reserved.