使用 apoc.load.json 从递归 JSON 数据创建图表并使用 UNWIND 和 FOREACH 设置 属性
Create graph from recursive JSON data using apoc.load.json and use UNWIND and FOREACH for setting property
我想从我的递归 JSON 文件创建一个图表。我的 JSON 数据如下。
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":1862,
"FileId":1225,
"FileName":"tables",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1861,
"FileId":1224,
"FileName":"Components",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1885,
"FileId":1247,
"FileName":"Filters",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1894,
"FileId":1253,
"FileName":"SFXPlugins",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1899,
"FileId":1255,
"FileName":"SonicResources",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1901,
"FileId":1257,
"FileName":"style",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":1905,
"FileId":1262,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1904,
"FileId":1260,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1903,
"FileId":1259,
"FileName":"NTSC",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":1910,
"FileId":1267,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1909,
"FileId":1265,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1908,
"FileId":1264,
"FileName":"PAL",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1902,
"FileId":1258,
"FileName":"Styles",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1860,
"FileId":1216,
"FileName":"CreateDisc",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1913,
"FileId":1269,
"FileName":"de-DE",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1994,
"FileId":1298,
"FileName":"en-US",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":2050,
"FileId":1328,
"FileName":"X02",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":2049,
"FileId":1327,
"FileName":"MCX",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2066,
"FileId":1330,
"FileName":"MediaRenderer",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2091,
"FileId":1335,
"FileName":"sk-SK",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":2108,
"FileId":1359,
"FileName":"de-DE",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2116,
"FileId":1361,
"FileName":"en-US",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":2106,
"FileId":1350,
"FileName":"wow",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1856,
"FileId":1103,
"FileName":"ehome",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2120,
"FileId":1363,
"FileName":"en",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2122,
"FileId":1365,
"FileName":"en-US",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2135,
"FileId":1376,
"FileName":"Fonts",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":3117,
"FileId":2927,
"FileName":"config",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":2956,
"FileId":2118,
"FileName":"System32",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1844,
"FileId":1051,
"FileName":"Windows",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":3813,
"FileId":3072,
"FileName":"$OrphanFiles",
"Type":[
"DI",
"IN"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":0,
"FileId":5,
"FileName":"C:",
"Type":[
"DI"
],
"collapsed":1
}
我在这个 link 中找到了对我构建图表有用的解决方案 - https://community.neo4j.com/t/import-nodes-from-recursively-structured-json/11704
我能够在上述 link 的帮助下构建图表。我使用了下面给出的查询。
WITH 'file:///part-of-VTree.json' AS json_file
CALL apoc.load.json(json_file,"..FileId") YIELD value AS result
WITH json_file, result.result AS keys
UNWIND range(0,size(keys)-1) AS i
CALL apoc.load.json(json_file,"..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileId") YIELD value AS children
WITH keys[i] AS parent_key, children.result AS children
MERGE (parent:GroupNode {name: parent_key})
WITH parent, children
UNWIND children as child_key
MERGE (child:GroupNode {name: child_key})
MERGE (child)-[:CHILD_OF]->(parent)
RETURN *
这创建了一个图表,其中节点上提到了“FileId”,因为我将“FileId”作为“名称”属性。当我如下更改查询时
WITH 'file:///part-of-VTree.json' AS json_file
CALL apoc.load.json(json_file,"..FileId") YIELD value AS result
WITH json_file, result.result AS keys
UNWIND range(0,size(keys)-1) AS i
CALL apoc.load.json(json_file,"..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileId") YIELD value AS children
WITH keys[i] AS parent_key, children.result AS children
MERGE (parent:GroupNode {Fid: parent_key})
WITH parent, children
UNWIND children as child_key
MERGE (child:GroupNode {Fid: child_key})
MERGE (child)-[:CHILD_OF]->(parent)
RETURN *
它给了我一个图表,上面没有提到任何节点。早些时候我得到了上面提到的“FileId”的节点。
我想要的是上面提到“FileName”和“FileId”的节点 属性.
对于我当前的查询,我无法为我的节点设置属性。有什么方法可以为我的节点设置属性并在节点上显示“文件名”。 “FileName”并不总是唯一的,所以我无法通过提取所有“FileName”而不是“FileId”来创建图形。
“FileId”在我的案例中始终是唯一的。
谁能以某种方式帮助我获得我想要的结果。我需要协助。
提前致谢!
我解决了。这是我使用的查询:
WITH 'file:///part-of-VTree.json' AS json_file
CALL apoc.load.json(json_file,"$..FileId") YIELD value AS result
WITH json_file, result.result AS keys UNWIND range(0,size(keys)-1) AS i
CALL apoc.load.json(json_file,"$..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileId") YIELD value AS children
CALL apoc.load.json(json_file,"$..[?(@.FileId == '" + toString(keys[i]) + "')].FileName") YIELD value AS rname
CALL apoc.load.json(json_file,"$..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileName") YIELD value AS cname
WITH keys[i] AS parent_key, children.result AS children, rname.result AS rn, cname.result AS cn
MATCH (n {name:parent_key})
WITH n, children,rn,cn
UNWIND children AS child_key
OPTIONAL MATCH (n)-[:CHILD]->(m {name:child_key})
WITH n, rn, cn, collect(m) AS siblings
UNWIND range(0,size(rn)-1) AS k
SET n.label=toString(rn[k])
With cn,siblings
UNWIND range(0,size(cn)-1) AS j
FOREACH(j IN range(0, size(siblings)-1) |
FOREACH (p1 in [siblings[j]] |
Set p1.label=toString(cn[j])
))
RETURN *
希望这对某人有所帮助。
我想从我的递归 JSON 文件创建一个图表。我的 JSON 数据如下。
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":1862,
"FileId":1225,
"FileName":"tables",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1861,
"FileId":1224,
"FileName":"Components",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1885,
"FileId":1247,
"FileName":"Filters",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1894,
"FileId":1253,
"FileName":"SFXPlugins",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1899,
"FileId":1255,
"FileName":"SonicResources",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1901,
"FileId":1257,
"FileName":"style",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"ChildNodes":[
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":1905,
"FileId":1262,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1904,
"FileId":1260,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1903,
"FileId":1259,
"FileName":"NTSC",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":1910,
"FileId":1267,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1909,
"FileId":1265,
"FileName":"Symphony",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1908,
"FileId":1264,
"FileName":"PAL",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1902,
"FileId":1258,
"FileName":"Styles",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1860,
"FileId":1216,
"FileName":"CreateDisc",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1913,
"FileId":1269,
"FileName":"de-DE",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":1994,
"FileId":1298,
"FileName":"en-US",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":2050,
"FileId":1328,
"FileName":"X02",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":2049,
"FileId":1327,
"FileName":"MCX",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2066,
"FileId":1330,
"FileName":"MediaRenderer",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2091,
"FileId":1335,
"FileName":"sk-SK",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":2108,
"FileId":1359,
"FileName":"de-DE",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2116,
"FileId":1361,
"FileName":"en-US",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":2106,
"FileId":1350,
"FileName":"wow",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1856,
"FileId":1103,
"FileName":"ehome",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2120,
"FileId":1363,
"FileName":"en",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2122,
"FileId":1365,
"FileName":"en-US",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":2135,
"FileId":1376,
"FileName":"Fonts",
"Type":[
"DI"
],
"collapsed":1
},
{
"ChildNodes":[
{
"FSId":1,
"FileDetailId":3117,
"FileId":2927,
"FileName":"config",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":2956,
"FileId":2118,
"FileName":"System32",
"Type":[
"DI"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":1844,
"FileId":1051,
"FileName":"Windows",
"Type":[
"DI"
],
"collapsed":1
},
{
"FSId":1,
"FileDetailId":3813,
"FileId":3072,
"FileName":"$OrphanFiles",
"Type":[
"DI",
"IN"
],
"collapsed":1
}
],
"FSId":1,
"FileDetailId":0,
"FileId":5,
"FileName":"C:",
"Type":[
"DI"
],
"collapsed":1
}
我在这个 link 中找到了对我构建图表有用的解决方案 - https://community.neo4j.com/t/import-nodes-from-recursively-structured-json/11704 我能够在上述 link 的帮助下构建图表。我使用了下面给出的查询。
WITH 'file:///part-of-VTree.json' AS json_file
CALL apoc.load.json(json_file,"..FileId") YIELD value AS result
WITH json_file, result.result AS keys
UNWIND range(0,size(keys)-1) AS i
CALL apoc.load.json(json_file,"..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileId") YIELD value AS children
WITH keys[i] AS parent_key, children.result AS children
MERGE (parent:GroupNode {name: parent_key})
WITH parent, children
UNWIND children as child_key
MERGE (child:GroupNode {name: child_key})
MERGE (child)-[:CHILD_OF]->(parent)
RETURN *
这创建了一个图表,其中节点上提到了“FileId”,因为我将“FileId”作为“名称”属性。当我如下更改查询时
WITH 'file:///part-of-VTree.json' AS json_file
CALL apoc.load.json(json_file,"..FileId") YIELD value AS result
WITH json_file, result.result AS keys
UNWIND range(0,size(keys)-1) AS i
CALL apoc.load.json(json_file,"..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileId") YIELD value AS children
WITH keys[i] AS parent_key, children.result AS children
MERGE (parent:GroupNode {Fid: parent_key})
WITH parent, children
UNWIND children as child_key
MERGE (child:GroupNode {Fid: child_key})
MERGE (child)-[:CHILD_OF]->(parent)
RETURN *
它给了我一个图表,上面没有提到任何节点。早些时候我得到了上面提到的“FileId”的节点。 我想要的是上面提到“FileName”和“FileId”的节点 属性.
对于我当前的查询,我无法为我的节点设置属性。有什么方法可以为我的节点设置属性并在节点上显示“文件名”。 “FileName”并不总是唯一的,所以我无法通过提取所有“FileName”而不是“FileId”来创建图形。 “FileId”在我的案例中始终是唯一的。
谁能以某种方式帮助我获得我想要的结果。我需要协助。 提前致谢!
我解决了。这是我使用的查询:
WITH 'file:///part-of-VTree.json' AS json_file
CALL apoc.load.json(json_file,"$..FileId") YIELD value AS result
WITH json_file, result.result AS keys UNWIND range(0,size(keys)-1) AS i
CALL apoc.load.json(json_file,"$..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileId") YIELD value AS children
CALL apoc.load.json(json_file,"$..[?(@.FileId == '" + toString(keys[i]) + "')].FileName") YIELD value AS rname
CALL apoc.load.json(json_file,"$..[?(@.FileId == '" + toString(keys[i]) + "')].ChildNodes[*].FileName") YIELD value AS cname
WITH keys[i] AS parent_key, children.result AS children, rname.result AS rn, cname.result AS cn
MATCH (n {name:parent_key})
WITH n, children,rn,cn
UNWIND children AS child_key
OPTIONAL MATCH (n)-[:CHILD]->(m {name:child_key})
WITH n, rn, cn, collect(m) AS siblings
UNWIND range(0,size(rn)-1) AS k
SET n.label=toString(rn[k])
With cn,siblings
UNWIND range(0,size(cn)-1) AS j
FOREACH(j IN range(0, size(siblings)-1) |
FOREACH (p1 in [siblings[j]] |
Set p1.label=toString(cn[j])
))
RETURN *
希望这对某人有所帮助。