使用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","date":"20211201","location":"England"},
"actors":{"42815":"Lala","45867":"Tutu"},
"data":{"2877:-99033:-979":{"4939":[86970],"4934":[74975,45867],"4935":[42815,88187],"4933":[74017],"4932":[45867],"4931":[78901,45867],"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节点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"│
└───────┴──────┘

最新更新