我有以下json文件(data.json):
{
"data": [
{"name": "Folder One", "type": "folder", "id": 1},
{"name": "Folder Two", "type": "folder", "id": 2},
{"name": "File One", "type": "file", "id": 1, "folder_id": 1},
{"name": "File Two", "type": "file", "id": 2, "folder_id": 2}
]
}
我要导入并创建两个标签(:Folder
和:File
)和一个关系[:BELONGS_TO]
。
被困在这里:
CALL apoc.load.json("file:/data.json") YIELD value
with value['data'] as data
UNWIND data as row
...
(
foreach where type is "folder" create a :Folder
foreach where type is "file" create a :File and a relationship [:BELONGS_TO] to folder
)
您将如何做?
答案 0 :(得分:1)
您需要在FOREACH中对匹配的标签进行硬编码。
首先,在File and Folder的id属性上创建一个索引:
CREATE INDEX ON :File(id)
CREATE INDEX ON :Folder(id)
然后创建节点或关系:
CALL apoc.load.json("file:/data.json") YIELD value
with value['data'] as data
UNWIND data as row
FOREACH (ignoreMe in CASE WHEN row.type="folder" THEN [1] ELSE [] END |
MERGE (f:Folder{id: row.id})
SET f.name= row.name)
FOREACH (ignoreMe in CASE WHEN row.type="file" THEN [1] ELSE [] END |
MERGE (folder:Folder{id: row.folder_id})
MERGE (file:File{id: row.id})
ON CREATE SET
file.name= row.name
MERGE (file)-[:BELONGS_TO]->(folder))
答案 1 :(得分:0)
我们通常不鼓励使用单个导入文件来创建多个不相关类型的节点,但是对于这些情况,有两种不同的方法:
对文件使用多次遍历,每种类型遍历一次,过滤每种类型的行,以便仅对查询中一种类型的节点进行处理,并在硬编码标签上使用CREATE或MERGE(并确保您拥有索引)如果使用MERGE则显示)。
对所有导入的节点使用通用类型(例如:Node,如果它非常通用,或者更通用的类型适合要在文件中导入的所有类型),以便所有节点都可以创建或合并(和如果使用MERGE,请再次确保您存在与更通用标签关联的索引。请使用该通用标签,并在创建节点后使用APOC Procedures用apoc.create.addLabels()动态设置其余标签。
因为您的结构是关于创建文件夹和文件以及它们之间的关系,所以我建议第一种方法,首先创建所有:Folder节点,然后第二次创建:File节点,以执行与先前导入的匹配:文件夹节点并创建关系。