如何在Neo4j中创建或创建一个唯一的子节点

时间:2016-08-15 19:30:52

标签: neo4j

我是Neo4j的新手,并试图建立一个音乐数据库。简单来说,我只是玩两个标签:

  • Artist
  • Song

显然这是父子关系,其中SongArtist(或可能是多个Artist s)的孩子,可能看起来像:

(:Artist {name:'name'})-[:RECORDED]->(:Song {title:'title'})

我做出以下假设:

  • 艺术家名称是唯一的
  • 歌曲标题唯一
  • 重复摄取数据是不可避免的

举一个我想做的例子:

  1. 我摄取伦纳德科恩的“哈利路亚”。创建了一个新的Artist节点和Song节点,其关系为RECORDED
  2. 我摄取杰夫巴克利的“哈利路亚”。同样,创建了新的ArtistSong节点,其关系为RECORDED。第一个“哈利路亚”Song根本没有与这个新图表相关联。
  3. 我再次由杰夫巴克利摄取“哈利路亚”。没有任何事情发生。
  4. 我摄取杰夫巴克利的“丁香酒”。我们重用旧的Artist节点,但我有一个新的Song节点,RECORDED关系
  5. 据我所知,使用MERGE让我接近,但不是那里(它会停止ARTIST的重复,而不是SONG的重复。如果我使用CREATE,则第3号点无效。

    我想我可以在SONG标签上添加另一个属性来跟踪其ARTIST(因此我可以使其成为唯一的),但这似乎有点多余而且是图形数据库的唯一性,不是吗?

    有没有人对最简洁的执行这些关系和要求的方式有任何明智的想法?

1 个答案:

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