Tenho nós do rótulo TypeA que têm uma propriedade de string, propA. propA é uma string JSON e pode ser convertida em um mapa usando apoc.convert.fromJsonMap().
Quero criar novos nós do Tipo B, cujas propriedades são propA e criar um relacionamento entre ambos os nós. Executei a seguinte consulta com sucesso:
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;
No entanto, quando uso o seguinte com apoc.periodic.iterate para converter meu banco de dados inteiro, ele lança um erro. A consulta que estou executando:
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});
O erro:
{
"Expected ReferenceFromSlot(2) to be a map, but it was :`NO_VALUE`": 4382
}
Qualquer ajuda é muito apreciada.
Seus
propA
valores JSON aparentemente não são compatíveis com o neo4j. Para atribuir todos os valores de propriedade (de um nó ou relacionamento), seus dados de origem precisam ser um mapa (e cada valor de propriedade deve ter um type em conformidade ). Verifique se todos os seuspropA
valores são compatíveis com os requisitos do neo4j.Além disso, você tem outro problema sério. Seu código atual não está criando um novo
TypeB
nó para cadavalues
mapa exclusivo. Isso ocorre porqueMERGE (v:TypeB)
não especifica valores de propriedade e, portanto, encontra qualquerTypeB
nó e se vincula a ele (umTypeB
nó só é criado primeiro se o BD não tiver nenhumTypeB
nó). ASET v=values
cláusula separada é executada depois que esseTypeB
nó for encontrado.Para fazer o que você quer, o
propA
JSON precisa de uma propriedade identificadora exclusiva (presumo que ela se chamaid
), e você precisa mudarMERGE (v:TypeB)
para algo comoMERGE (v:TypeB {id: values.id})
.Além disso, para eficiência e para garantir que
MERGE
funcione corretamente, você deve criar uma restrição de unicidade de nó emTypeB.id
(assumindo que meu exemploMERGE
mude). Fazer isso adiciona automaticamente um índice para você também.