如何在Neo4j中获取或创建独特的子节点

问题描述:

我是Neo4j的新手,尝试设置音乐数据库来玩耍。从简单开始,我只是有两个标签玩:如何在Neo4j中获取或创建独特的子节点

  • Artist
  • Song

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

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

我在做后续荷兰国际集团假设:

  • 艺术家名称是唯一
  • 歌曲标题是独特
  • 重复采集的数据是不可避免的

举的想什么,我做的一个例子:

  1. 我摄入伦纳德科恩的“哈利路亚”。创建了一个新的Artist节点和Song节点,其中RECORDED关系
  2. 我通过Jeff Buckley摄入“Hallelujah”。再次,创建新的ArtistSong节点,关系为RECORDED。第一个“哈利路亚”Song根本没有与这个新图形关联。
  3. 我再次通过Jeff Buckley摄取“哈利路亚”。什么都没发生。
  4. 我摄入Jeff Buckley的“丁香葡萄酒”。我们再用我们的老Artist节点,但我有一个RECORDED关系

从我可以告诉一个新Song节点,使用MERGE让我接近,但并不完全存在(它停止ARTIST的重复,但不的SONG)。如果我使用CREATE,则点编号3.不能正常工作。

我想我可以添加另一个属性到SONG标签跟踪其ARTIST(因此我可以做出独特的),但这似乎有点冗余和单一的图形数据库,不是?

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

合并艺术家第一次,之后宋:

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 
+0

这确实工作,虽然现在已经看到了语法多么复杂需要是实现这一目标,我倾向于只使用一个冗余'artist'我可以写'MERGE(a) - [:RECORDED] - >(s:Song {title:'Hallelujah',艺术家:'Leonard Cohen'})'(或者甚至是一起去掉'Artist'标签?!) – Alec

我不认为歌曲标题是独一无二的东西,尤其是如果此图谱包含现有歌曲的封面。

确定一些额外的手段来暗示唯一性是要走的路。

艺术家是一种方式。记录日期可能是另一个需要考虑的数据。如果您从其他类型的数据库中读取这些数据,则可能会有其他唯一ID用于唯一性。

无论如何,一旦你有你想用来确定唯一性的领域,合并您的歌曲节点与所有这些领域存在。