使用apoc.load.json导入带有对象数组的JSON

时间:2019-08-13 12:42:45

标签: neo4j cypher neo4j-apoc

需要帮助导入一些带有对象数组的API json(TMDB)。 专门从对象中提取ID列表,并将其设置为节点的数组属性

尝试使用收集功能收效甚微

WITH 'https://api.themoviedb.org/3/movie/118340?api_key=f1c5e4598bf37ad6e7e915a682ebb3b4&language=en-US&append_to_response=videos' AS uri
CALL apoc.load.json(uri)
YIELD value

MERGE (movie:Movie {original_title: value.original_title})

// We have to deal with object properties separately
// In this case a Collection
WITH value, movie, value.belongs_to_collection AS collection
SET movie.collection_id = collection.id
MERGE (c:Collection {name: collection.name})
SET c.id = collection.id,
    c.poster_path =  collection.poster_path,
    c.backdrop_path=  collection.backdrop_path

// We have to deal with the genres array
// Store them in a genre_ids array property in Movie
// while MERGEing them to :Genres
WITH *
UNWIND value.genres AS genre
MERGE (g:Genre {
    name: genre.name,
    id: genre.id
})
// Need to collect() the genres list (ids) into :Movie.genre_ids

任何帮助表示赞赏;)

2 个答案:

答案 0 :(得分:0)

使其工作如下:

// We have to deal with the genres array
// Store them in a genre_ids array property in Movie
// while MERGEing them to :Genres
WITH *
UNWIND value.genres AS genre
MERGE (g:Genre {
    name: genre.name,
    id: genre.id
})
WITH movie, collect(genre.id) AS col
// Need to collect() the genres into :Movie.genre_ids
SET movie.genre_ids = col

欢迎其他任何建议! ;)

答案 1 :(得分:0)

关于您的问题的几点想法:

首先,在执行SET movie.genre_ids = col时,您会获得“ col”的最后一个元素,其原因是列表的性质,因此您的输出类似于[“ something”],而不是“ something”。但是您可以指定元素在列表中的位置并获取它,例如:

SET movie.genre_ids = col[1]

第二,如果我说对了,为什么这样做有点令人困惑:

WITH movie, collect(genre.id) AS col

如果您需要按照相应的电影流派对电影进行分组,则可能会发现有用:

 WITH {movie: movie, col: collect(genre.id)} as col

这样做,如果一部电影属于多个流派,则可以获取特定于该特定电影的所有流派,但首先需要在电影和流派之间建立联系。

但是,如果您只需要将所有流派存储在一个变量中,那么我就没有这个目的。在图数据库中,您拥有节点,就您而言,这些节点是电影和体裁。例如,如果您有一个节点“ Matrix”标记为“电影”和“科幻”,而“动作”节点标记为“流派”,则可以将它们相互关联(尚未完成,请查看您提供的代码),因此“矩阵”与“科幻小说”和“动作”相关。然后,您可以执行以下操作:

Match (n:Movie) 
RETURN(n:Movie{original_title: 'Matrix'})-[:hasGenre]-()

您将获得具有所有相关流派的电影。

我希望它对您有用!