我是Neo4j的新手,并试图建立一个音乐数据库。简单来说,我只是玩两个标签:
Artist
Song
显然这是父子关系,其中Song
是Artist
(或可能是多个Artist
s)的孩子,可能看起来像:
(:Artist {name:'name'})-[:RECORDED]->(:Song {title:'title'})
我做出以下假设:
举一个我想做的例子:
Artist
节点和Song
节点,其关系为RECORDED
Artist
和Song
节点,其关系为RECORDED
。第一个“哈利路亚”Song
根本没有与这个新图表相关联。Artist
节点,但我有一个新的Song
节点,RECORDED
关系据我所知,使用MERGE
让我接近,但不是那里(它会停止ARTIST
的重复,而不是SONG
的重复。如果我使用CREATE
,则第3号点无效。
我想我可以在SONG
标签上添加另一个属性来跟踪其ARTIST
(因此我可以使其成为唯一的),但这似乎有点多余而且是图形数据库的唯一性,不是吗?
有没有人对最简洁的执行这些关系和要求的方式有任何明智的想法?
答案 0 :(得分:1)
首先合并艺术家,然后合并歌曲:
WITH 'Leonard Cohen' AS ArtistName,
'Hallelujah' AS SongTitle
MERGE (A:Artist {name:ArtistName})
WITH A,
SongTitle
OPTIONAL MATCH p=(A)-[:RECORDED]->(:Song {title:SongTitle})
FOREACH (x in CASE WHEN p IS NULL THEN [1] ELSE [] END |
CREATE (S:Song {title:SongTitle})
MERGE (A)-[:RECORDED]->(S)
)
WITH A,
SongTitle
MATCH p = (A)-[:RECORDED]->(:Song {title:SongTitle})
RETURN p