2016-08-15 3 views
0

Я новичок в Neo4j и поиграю, пытаясь создать музыкальную базу данных. Для начала просто, я просто играл с двумя метками:Как получить или создать уникальный дочерний узел в Neo4j

  • Artist
  • Song

Очевидно, что это родитель-потомок, где Song является ребенок из Artist (или возможно, несколько Artist ы), и может выглядеть примерно так:

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

Я делающего последующие ИНГ предположение:

  • имена художников являются уникальными
  • песни названия не уникальных
  • Дублирования данных употребляют являются неизбежным

Чтобы дать пример того, что я хотел бы сделать:

  1. Я глотаю «Аллилуйю» Леонарда Коэна. Созданы новый узел Artist и Song, с RECORDED отношениями
  2. Я глотаю «Аллилуйя» Джеффа Бакли. Снова создаются новые Artist и Song узел с отношениями RECORDED. Первый «Аллилуйя» Song не связан с этим новым графиком вообще.
  3. Я снова глотаю «Аллилуйю» Джеффа Бакли. Ничего не произошло.
  4. Я глотаю «Сиреневое вино» Джеффа Бакли. Мы повторно наш старый Artist узел, но у меня есть новый Song узел с RECORDED отношений

Из того, что я могу сказать, используя MERGE получает меня близко, но не совсем там (он останавливает дублирование ARTIST, но не от SONG). Если я использую CREATE, то номер 3. не работает должным образом.

Я думаю, я мог бы добавить еще одно свойство к метке SONG, которая отслеживает ее ARTIST (и поэтому я могу сделать уникальный), но это кажется немного избыточным и унииоматичным из базы данных графа, нет?

Есть ли у кого-нибудь яркие идеи относительно наиболее лаконичного способа обеспечения соблюдения этих отношений и требований?

ответ

1

Merge Исполнитель первым, а после песни:

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 {название:« Hallelujah », исполнитель:« Leonard Cohen »})' (или, может быть, даже покончить с лейблом «Артист»?) – Alec

0

Я не думаю, что название песни - это то, на что вы можете положиться на уникальность, особенно если этот график включает в себя обложки существующих песен.

Определение некоторых дополнительных средств для обозначения уникальности - путь.

Художник в одном направлении. Записанная дата может быть другой частью данных. Если вы читаете это из какой-либо другой базы данных, может быть другой уникальный идентификатор, который они используют для уникальности.

В любом случае, если у вас есть поля, которые вы хотите использовать для определения уникальности, MERGE ваш узел песни со всеми этими полями.

Смежные вопросы