使用中间表在两个节点之间创建关系

时间:2019-11-06 23:07:08

标签: neo4j cypher neo4j-browser

我对Neo4j领域还很陌生,所以如果这是一个琐碎的问题,请原谅我。我有2个表已使用LOAD CSV加载到数据库中

艺术家:

artist_name,artist_id
"Bob","abc"
"Jack","def"
"James","ghi"
"Someone","jkl"
"John","mno"

agency_list:

"Agency"
"A"
"B"
"C"
"D"

最后,我有一个中间表,其中包含艺术家和代表他们的代理商。

artist_agencies:

artist_name,artist_id,agency
"Bob","abc", "A"
"Bob","abc", "B"
"Jack","def", "C"
"James","ghi", "C"
"Someone","jkl","B"
"Someone","jkl", "C"
"John","mno", "D"

请注意,某些艺术家可以成为多个代理机构的一部分(这就是为什么我没有在Artist表中包括agency变量的原因)

我正在尝试基于:REPRESENTS关系建立连接到每个艺术家的四个代理节点。基本上像这样: (agency:Agency) - [:REPRESENTS] -> (artist:Artist)

我尝试过的代码是:

LOAD CSV WITH HEADERS FROM "file:///agency_list.csv" as agencies
CREATE (agency:Agency {agency: agencies.Agency})

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///artists.csv" as artists
CREATE (artist:Artist {artist: artists.artist_name, artist_id: artists.artist_id})

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///artist_agencies.csv" as line 
CREATE (ag:Agency) - [:REPRESENTS] -> (ar:Artist {track_artist_uri:line.track_artist_uri})

到目前为止,我明白了,每个蓝色节点都是代理商名称的重复。不仅仅是拥有一个通过:REPRESENTS关系连接到所有艺术家的单一代理节点。 result

我想我的问题是我不知道如何通过此中间artist_agencies表将Artists表与agency_list表关联。有没有更好的方法可以做到这一点?或者我走在正确的轨道上?

谢谢! 乔伊

1 个答案:

答案 0 :(得分:0)

artist_agencies.csv查询需要先找到适当的AgencyArtist节点,然后才能在它们之间建立关系。例如:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///artist_agencies.csv" as line
MATCH (ag:Agency) WHERE ag.agency = line.agency
MATCH (ar:Artist) WHERE ar.artist_id = line.artist_id
CREATE (ag)-[:REPRESENTS]->(ar)

旁边:artist_agencies.csv文件不需要artist_name列。

[更新]

如果artist_agencies.csv数据可能导致创建重复关系,请将CREATE替换为(更昂贵的)MERGE,以避免这种情况。并且确保您没有重复的AgencyArtist节点。

相关问题