从neo4j中的json文件导入和创建多个标签和关系

时间:2019-04-17 13:50:41

标签: neo4j cypher

我有以下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
)

您将如何做?

2 个答案:

答案 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)

我们通常不鼓励使用单个导入文件来创建多个不相关类型的节点,但是对于这些情况,有两种不同的方法:

  1. 对文件使用多次遍历,每种类型遍历一次,过滤每种类型的行,以便仅对查询中一种类型的节点进行处理,并在硬编码标签上使用CREATE或MERGE(并确保您拥有索引)如果使用MERGE则显示)。

  2. 对所有导入的节点使用通用类型(例如:Node,如果它非常通用,或者更通用的类型适合要在文件中导入的所有类型),以便所有节点都可以创建或合并(和如果使用MERGE,请再次确保您存在与更通用标签关联的索引。请使用该通用标签,并在创建节点后使用APOC Proceduresapoc.create.addLabels()动态设置其余标签。

因为您的结构是关于创建文件夹和文件以及它们之间的关系,所以我建议第一种方法,首先创建所有:Folder节点,然后第二次创建:File节点,以执行与先前导入的匹配:文件夹节点并创建关系。