首页 > 解决方案 > 在 Neo4j 中使用 apoc.load.jason() 时如何拥有一组 Json 键对象?

问题描述

我有以下 Json,我想为每个随机哈希 id 的键创建节点,我还需要这些哈希键将它们的嵌套对象作为节点展开。我怎样才能有一个包含这些哈希键的对象数组(不是字符串数组)。EX 数组 = [bacf06771e0f4fc5a8e68c30fc77c9c4,948eeebd73564adab7dee5c6f177b3b9]。我需要 UNWIND array[0].arg1 AS arg1

{
    "bacf06771e0f4fc5a8e68c30fc77c9c4":{
        "arg1":"the Treasury",
        "arg2":"details of the November refunding",
        "relation":"will announce",
        "id":"bacf06771e0f4fc5a8e68c30fc77c9c4",
        "linkedContexts":[
            {
                "targetID":"948eeebd73564adab7dee5c6f177b3b9",
                "classification":"CONTRAST"
            }
        ]
    },
    "948eeebd73564adab7dee5c6f177b3b9":{
        "arg1":"the funding",
        "arg2":"",
        "relation":"will be delayed",
        "id":"948eeebd73564adab7dee5c6f177b3b9",
        "linkedContexts":[
            {
                "targetID":"006a71e51295440fab7a8e8c697d2ba6",
                "classification":"CONDITION"
            }
        ]
    }
}

我试过了:

Call apoc.load.json("files:/example.json") Yield value 
unwind value.sentences as v
foreach (k in keys(v)|merge (arg1:Arg1 {subject:k.arg1}) 
    merge (arg2:Arg2 {object:k.arg2}) 
    merge (arg1)-[:Related_to]->(arg2))

并得到错误:

`Neo.ClientError.Statement.SyntaxError: Type mismatch: expected Any, 
Map,Node, Relationship, Point, Duration, Date, Time, LocalTime, 
LocalDateTime or DateTime but was String
(line 8, column 27 (offset:371)):"merge (arg1:Arg1 {subject:k.arg1})"

标签: arraysjsonneo4jcypherneo4j-apoc

解决方案


value没有sentences钥匙。

如果您的数据文件与显示的完全相同,则以下查询应该可以工作。

CALL apoc.load.json("files:///example.json") YIELD value 
FOREACH (v in [k IN KEYS(value) | value[k]] |
  MERGE (arg1:Arg1 {subject:v.arg1}) 
  MERGE (arg2:Arg2 {object:v.arg2}) 
  MERGE (arg1)-[:Related_to]->(arg2))

列表推导生成地图的子图列表value

[k IN KEYS(value) | value[k]]

或者,您可以使用UNWIND而不是FOREACH如下:

CALL apoc.load.json("files:///example.json") YIELD value
UNWIND [k IN KEYS(value) | value[k]] AS v
MERGE (arg1:Arg1 {subject:v.arg1}) 
MERGE (arg2:Arg2 {object:v.arg2}) 
MERGE (arg1)-[:Related_to]->(arg2)

推荐阅读