2016-08-15 81 views
0

我是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(因此我可以做出獨特的),但這似乎有點冗餘和單一的圖形數據庫,不是?

有沒有人對執行這些關係和要求最簡潔的方式有任何明智的想法?

回答

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

這確實工作,雖然現在已經看到了語法多麼複雜需要是實現這一目標,我傾向於只使用一個冗餘'artist'我可以寫'MERGE(a) - [:RECORDED] - >(s:Song {title:'Hallelujah',藝術家:'Leonard Cohen'})'(或者甚至是一起去掉'Artist'標籤?!) – Alec

0

我不認爲歌曲標題是獨一無二的東西,尤其是如果此圖譜包含現有歌曲的封面。

確定一些額外的手段來暗示唯一性是要走的路。

藝術家是一種方式。記錄日期可能是另一個需要考慮的數據。如果您從其他類型的數據庫中讀取這些數據,則可能會有其他唯一ID用於唯一性。

無論如何,一旦你有你想用來確定唯一性的領域,合併您的歌曲節點與所有這些領域存在。