我正在制作一张Neo4j图来展示音乐艺术家的网络。
我有一个包含几列的CSV。第一列名为Artist
,是制作歌曲的人。第二列和第三列分别称为Feature1
和Feature2
,代表歌曲中的特色艺术家(参见示例https://docs.google.com/spreadsheets/d/1TE8MtNy6XnR2_QE_0W8iwoWVifd6b7KXl20oCTVo5Ug/edit?usp=sharing)
我已合并,以便任何给定的艺术家只有一个节点。艺术家通过FEATURED
关系与strength
属性相关联,该属性代表某人被推荐的次数。初始化关系时,关系属性强度设置为1.例如,(X)-[r:FEATURED]->(Y)
第一次出现r.strength = 1
时。
CREATE CONSTRAINT ON (a:artist) ASSERT a.artistName IS UNIQUE;
CREATE CONSTRAINT ON (f:feature) ASSERT f.artistName IS UNIQUE;
CREATE CONSTRAINT ON (f:feature1) ASSERT f.artistName IS UNIQUE;
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS from 'aws/artist-test.csv' as line
MERGE (artist:Artist {artistName: line.Artist})
MERGE (feature:Artist {artistName: line.Feature1})
MERGE (feature1:Artist {artistName: line.Feature2})
CREATE (artist)-[:FEATURES {strength:1}]->(feature)
CREATE (artist)-[:FEATURES {strength:1}]->(feature1)
然后我删除了没有功能的歌曲的无节点
MATCH (artist:Artist {artistName:'None'})
OPTIONAL MATCH (artist)-[r]-()
DELETE artist, r
如果X在CSV的另一首歌曲上显示Y,则代码当前与r.strength = 1
创建另一个(重复)关系。我希望只创建一个(先前创建的)关系,并将r.strength
的值增加1,而不是创建新的关系。
知道我该怎么办?我目前的方法是创建一堆重复的关系,然后返回并计算所有重复的关系,并设置
r.strength = #duplicate relationships
。但是,我无法让它工作,在我浪费更多时间之前,我认为有一种更有效的方法来实现这一目标。
非常感谢任何帮助。谢谢!
答案 0 :(得分:0)
您可以在与ON MATCH SET的关系上使用MERGE
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS from 'aws/artist-test.csv' as line
MERGE (artist:Artist {artistName: line.Artist})
MERGE (feature:Artist {artistName: line.Feature1})
MERGE (feature1:Artist {artistName: line.Feature2})
MERGE (artist)-[f1:FEATURES]->(feature)
ON CREATE SET f1.strength = 1
ON MATCH SET f2.strength = f1.strength + 1
MERGE (artist)-[f2:FEATURES]->(feature1)
ON CREATE SET f2.strength = 1
ON MATCH SET f2.strength = f2.strength + 1