如何在Neo4j中有条件地从CSV中添加属性

时间:2017-11-30 06:53:23

标签: neo4j

我正在制作一张Neo4j图来展示音乐艺术家的网络。

我有一个包含几列的CSV。第一列名为Artist,是制作歌曲的人。第二列和第三列分别称为Feature1Feature2,代表歌曲中的特色艺术家(参见示例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。但是,我无法让它工作,在我浪费更多时间之前,我认为有一种更有效的方法来实现这一目标。

非常感谢任何帮助。谢谢!

1 个答案:

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