2016-08-15 15 views
0

私はNeo4jを初めて使用し、音楽データベースを設定しようとして遊んでいます。明らかにこれはSongArtistの子である親子関係、(あるかNeo4jで独自の子ノードを取得または作成する方法

  • Artist
  • Song

:シンプル開始するには、私はちょうど2つのラベルで遊びました

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

私がフォローを作っています。場合によっては複数のArtist秒)し、次のようになりますINGの仮定:

  • アーティスト名ユニーク
  • 曲のタイトルは
  • ないユニークな重複取り込みデータは私が何をしたいかの例を与えることを

避けられないですされています。

  1. 私はLeonard Cohenの「Hallelujah」を摂取しています。新しいArtistノードとSongノードが作成され、RECORDEDの関係
  2. Jeff Buckleyが "Hallelujah"を摂取します。ここでも新しいArtistノードとSongノードが作成され、RECORDEDの関係があります。最初の "Hallelujah" Songは、この新しいグラフにはまったく関連付けられていません。
  3. もう一度Jeff Buckleyさんが "Hallelujah"を摂取します。何も起こりません。
  4. 私はJeff Buckleyの「ライラックワイン」を摂取しています。私たちは、私たちの古いArtistノードを再利用するが、私はMERGEは私が近づい使用して、伝えることができるものから、

RECORDED関係で新しいSongノードを持って、しかしかなりあり(それはARTISTの重複を停止しますが、ではありませんSONGの)。 CREATEを使用すると、ポイント番号3が正しく機能しません。

ARTISTを追跡するSONGラベルに別のプロパティを追加することができます(それゆえ、私は一意にすることができます)。しかし、これは少し冗長でグラフデータベースの一義的なようですね。

誰もが、これらの関係や要件を実施する最も簡潔な方法について明るいアイデアを持っていますか?

答えて

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'を使用するに傾いています私の 'ソング'のプロパティには ''マージ(a) - [:録音] - >(s:Song {タイトル: 'Hallelujah'、アーティスト: 'Leonard Cohen'} ' 'Artist'レーベルと一緒にやってみましょうか?) – Alec

0

特に、このグラフには既存の曲のカバーが含まれている場合、曲のタイトルは一意性に頼ることはできません。

一意性を暗示するいくつかの追加手段を決定する方法があります。

アーティストは片道です。記録された日付は、考慮すべき別のデータです。他の種類のデータベースからこれを読んでいるなら、一意性のために使う他の一意のIDがあるかもしれません。

どのような場合でも、一意性を判断するために使用するフィールドがあれば、それらのフィールドがすべて存在する曲ノードをマージします。

最初
関連する問題