neo4j - 在 Neo4j 中为关系设置属性
问题描述
我是 Neo4j 的新手,正在研究 movielens 数据集。我试图创建的图表如下: ,用户的属性(User{userID,Gender,Age,Occupation})-[WATCHED{Rating}]->(Movie{Title,Genres})
在哪里,关系的属性是,的属性是。userID,Gender,Age,Occupation
Rating
WATCHED
Title,Genres
Movie
我的数据如下所示:
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]
解决方案
像其他一样拆分 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)
推荐阅读
- javascript - 你能在 typicode json-server 中使用 ES6 导入/导出吗
- python - 错误:“TypeError:hidden_tag() 缺少 1 个必需的位置参数:'self'”在 Flask,python
- c# - 在 C# 中从 Json 生成实体类
- redis - 为什么 Elasticache Redis 实例上的只读副本未显示处理任何读取请求?
- android-room - LiveData 永远不会更新
- javascript - 如何删除 Javascript 函数 toLocaleString 的逗号
- javascript - 如何更改 GraphQL 订阅的错误处理策略
- android - 防止从通知点击创建新活动
- python - 如何将两个表单保存在模型中的同一模板中
- typescript - 如何将 JSON 数组映射到类实例数组,其构造函数将 JSON 作为 TypeScript 中的参数?