使用CYPHER读取json中的json属性名称

问题描述

我的 Neo4J 数据库有这种输入 JSON 文件

    {"list":[
    {
      "extraction":{"extractorId":"45485","date":"20211201","location":"France"},"actors":{"88187":"Toto","74017":"Titi","78901":"Tata","45867":"Tutu"},"data":{"2877:-99033:-979":{"4934":[45867],"4935":[88187],"4933":[74017],"4932":[45867],"4931":[78901,45867],"4930":[78901]}}
    },{"extraction":{"extractorId":"45485","location":"England"},"actors":{"42815":"Lala","data":{"2877:-99033:-979":{"4939":[86970],"4934":[74975,"4935":[42815,88187],"4930":[78901]}}}
    ]}

如您所见,这不是标准的 JSON 格式,因为属性名称也可以是值。

如何使用 UNWIND、FOREACH 等来阅读此内容?单行 CYPHER 请求不是强制性的。

例如,如果我想用 (a:Actor {id,name}) 创建节点,如果我试试这个:

WITH "file:///data.json" as json
CALL apoc.load.json(json) YIELD value
UNWIND value.list AS item
UNWIND item.actors AS actors
RETURN actors

我明白

row1 :
{
  "45867": "Tutu","74017": "Titi","78901": "Tata","88187": "Toto"
}
row 2 : 
{
  "42815": "Lala","45867": "Tutu",}

如何获取 id 和名称以在 MERGE node cypher 命令中使用它们?

解决方法

keys 函数可以在这里提供帮助。详细说明您的初始查询:

WITH "file:///data.json" as json
CALL apoc.load.json(json) YIELD value
UNWIND value.list AS item
UNWIND item.actors AS actors
// Extract map's keys,that will be the ID
WITH keys(actors) as keys,actors
// "loop" over keys
UNWIND keys as key
RETURN key as id,actors[key] as name

结果:

╒═══════╤══════╕
│"id"   │"name"│
╞═══════╪══════╡
│"78901"│"Tata"│
├───────┼──────┤
│"45867"│"Tutu"│
├───────┼──────┤
│"74017"│"Titi"│
├───────┼──────┤
│"88187"│"Toto"│
├───────┼──────┤
│"45867"│"Tutu"│
├───────┼──────┤
│"42815"│"Lala"│
└───────┴──────┘