首页 > 解决方案 > 在 Neo4j 中为关系设置属性

问题描述

我是 Neo4j 的新手,正在研究 movielens 数据集。我试图创建的图表如下: ,用户的属性(User{userID,Gender,Age,Occupation})-[WATCHED{Rating}]->(Movie{Title,Genres})在哪里,关系的属性是,的属性是。userID,Gender,Age,OccupationRatingWATCHEDTitle,GenresMovie

我的数据如下所示:

UserID;Gender;Age;Occupation;MovieID;Ratings;Title;Genres
4;M;45;7;3468,1210,2951,1214,1036,260,2028,480,1196;5,3,4,4,4,5,5,4,2;Star Wars- Episode IV - A New Hope (1977),Jurassic Park (1993),Die Hard (1988),E.T. the Extra-Terrestrial (1982),Star Wars- Episode V - The Empire Strikes Back (1980),Raiders of the Lost Ark (1981),Good The Bad and The Ugly The (1966),Star Wars- Episode VI - Return of the Jedi (1983),Alien (1979);Action|Adventure|Fantasy|Sci-Fi,Action|Adventure|Sci-Fi,Action|Thriller,Childrens|Drama|Fantasy

我用来创建用户和电影节点的查询是:

LOAD CSV WITH HEADERS FROM 'file:///user_movie_info_user-rating.csv' AS line FIELDTERMINATOR ';'
WITH line,SPLIT(line.MovieID, ",") AS Movie,SPLIT(line.Title, ",") AS Title,SPLIT(line.Genres, ",") AS Genres
MERGE (u:User { uID:TOINTEGER(line.UserID),gender:line.Gender,age: TOINTEGER(line.Age),occupation:TOINTEGER(line.Occupation)})
WITH Movie,Title,Genres
UNWIND RANGE(0, SIZE(Movie)-1) as j
MERGE (m:Movie {MovieID:TOINTEGER(Movie[j]),Title:Title[j],Genre:Genres[j]})

在节点之间创建关系的查询是:

MATCH (m:Movie),(u:User) WHERE u.uID=1 AND m.MovieID in [3468,1210,2951,1214,1036,260,2028,480,1196] CREATE (u)-[s:WATCHED]->(m) RETURN type(s)

但是,我不确定如何将评级添加到WATCHED关系中。我试过这个

MATCH p=(u:User)-[r:WATCHED]->(m:Movie) WHERE u.uID=1 AND m.MovieID=1193 SET r.Rating=[5],

但这需要为每部电影运行。有没有更好的方法(如下所示)?

MATCH p=(u:User)-[r:WATCHED]->(m:Movie) WHERE u.uID=1 AND m.MovieID IN [1193,1210,2951] SET r.Rating IN [5,3,4]

标签: neo4jcypher

解决方案


像其他一样拆分 Ratings 字段,传递每个用户节点,并在创建电影节点的同时创建关系

LOAD CSV WITH HEADERS FROM 'file:///user_movie_info_user-rating.csv' AS line FIELDTERMINATOR ';'
WITH line,
   SPLIT(line.MovieID, ",") AS Movie,
   SPLIT(line.Title, ",") AS Title,
   SPLIT(line.Genres, "|") AS Genres,
   SPLIT(line.Ratings, ",") AS Ratings

MERGE (u:User { uID:TOINTEGER(line.UserID),gender:line.Gender,age: TOINTEGER(line.Age),occupation:TOINTEGER(line.Occupation)})
WITH Movie,Title,Genres,Ratings, u

UNWIND RANGE(0, SIZE(Movie)-1) as j
MERGE (m:Movie {MovieID:TOINTEGER(Movie[j]),Title:Title[j],Genre:Genres[j]})
CREATE (u)-[:WATCHED{Rating:Ratings[j]}]->(m)

推荐阅读