2016-08-15 2 views
0

저는 Neo4j를 처음 사용하고 음악 데이터베이스를 설정하려고 시도하여 놀고 있습니다. 물론이 Neo4j에서 고유 한 자식 노드를 얻거나 만드는 방법

  • Artist
  • SongSongArtist의 자식 부모 - 자식 관계를, (또는 : 단순 시작하려면, 난 그냥 두 개의 레이블을 가지고 노는거야

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

    내가 추적을 만드는 중이라서 : 아마도 여러 Artist들), 그리고 같은 것을 보일 수 있습니다 보내고 가정 :

    • 아티스트 이름은 하지 독특한
    • 중복 인제 데이터를 피할 수 있습니다
    • 노래 제목이

    내가하고 싶은 무엇의 예를 제공하기 위해 고유 :

    1. 나는 "할렐루야"를 레오나드 코헨이 섭취합니다. 새 Artist 노드와 Song 노드가 생성되고 RECORDED 관계
    2. Jeff Buckley가 "할렐루야"를 섭취합니다. 다시 새로운 ArtistSong 노드가 생성되고 RECORDED 관계입니다. 첫 번째 "할렐루야"Song은이 새 그래프와 전혀 관련이 없습니다.
    3. Jeff Buckley가 다시 "할렐루야"를 섭취합니다. 아무 반응이 없습니다.
    4. Jeff Buckley가 "라일락 와인"을 섭취합니다. 우리는 우리의 오래된 Artist 노드를 재사용,하지만 난 MERGE를 사용하여 RECORDED 관계 내가 무엇을 말할 수에서

    로 새로운 Song 노드가 나를 가까이 가져,하지만 확실히이 (가 ARTIST의 중복을 중지하지만 SONG). CREATE을 사용하면 포인트 번호 3이 제대로 작동하지 않습니다.

    은 내가 추적하는 SONG 라벨에 다른 속성을 추가 할 수있는 생각의 ARTIST (내가 때문에 독특한 할 수 있습니다)하지만 약간의 중복 및 그래프 데이터베이스의 unidiomatic 것을, 아니?

    누구나 이러한 관계와 요구 사항을 적용하는 가장 간결한 방법에 대한 아이디어가 있습니까?

답변

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'를 사용하는 경향이 있어요 (노래 : {이름 : '할렐루야', 아티스트 : '레오나드 코헨'})'(또는 어쩌면 짝수 글자를 쓸 수 있습니다. '아티스트 (Artist) '레이블을 지우지 마십시오!) – Alec

0

특히이 그래프에 기존 노래의 표지가 포함되어있는 경우 고유성에 따라 노래 제목이 신뢰할 수 있다고 생각하지 않습니다.

고유성을 암시하는 몇 가지 추가 수단을 결정하는 것이 좋습니다.

아티스트는 편도입니다. 기록 된 날짜는 고려해야 할 또 다른 데이터 일 수 있습니다. 다른 종류의 데이터베이스에서 이것을 읽는다면 독자성을 위해 사용하는 다른 고유 ID가있을 수 있습니다.

어떤 경우이든, 고유성을 결정할 때 사용하려는 필드가 있으면 해당 필드가 모두있는 노래 노드를 병합하십시오.

관련 문제