Создание отношений между двумя узлами с использованием промежуточной таблицы - PullRequest
0 голосов
/ 07 ноября 2019

Я очень новичок в мире Neo4j, поэтому, пожалуйста, прости меня, если это тривиальный вопрос. У меня есть 2 таблицы, которые я загрузил в базу данных, используя LOAD CSV

исполнителей:

artist_name,artist_id
"Bob","abc"
"Jack","def"
"James","ghi"
"Someone","jkl"
"John","mno"

agency_list:

"Agency"
"A"
"B"
"C"
"D"

Наконец, у меня есть промежуточная таблица, котораяесть художник и агентства, которые его представляют.

artist_agencies:

artist_name,artist_id,agency
"Bob","abc", "A"
"Bob","abc", "B"
"Jack","def", "C"
"James","ghi", "C"
"Someone","jkl","B"
"Someone","jkl", "C"
"John","mno", "D"

Обратите внимание, что некоторые художники могут быть частью нескольких агентств (именно поэтому я не включил переменную агентства втаблица Artist)

Я пытаюсь получить четыре узла агентства, которые подключаются к каждому исполнителю на основе отношения: REPRESENTS. По сути, что-то вроде: (agency:Agency) - [:REPRESENTS] -> (artist:Artist)

Код, который я пробовал:

LOAD CSV WITH HEADERS FROM "file:///agency_list.csv" as agencies
CREATE (agency:Agency {agency: agencies.Agency})

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///artists.csv" as artists
CREATE (artist:Artist {artist: artists.artist_name, artist_id: artists.artist_id})

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///artist_agencies.csv" as line 
CREATE (ag:Agency) - [:REPRESENTS] -> (ar:Artist {track_artist_uri:line.track_artist_uri})

Пока я получаю это, каждый синий узел является дубликатом названия агентства. Вместо того, чтобы иметь один единственный агентский узел, который соединяется со всеми артистами через отношения: REPRESENTS. результат

Полагаю, моя проблема в том, что я не знаю, как связать таблицу исполнителей с таблицей agency_list через эту промежуточную таблицу artist_agencies. Есть ли лучший способ сделать это, или я на правильном пути?

Спасибо! Джоуи

1 Ответ

0 голосов
/ 07 ноября 2019

Запрос artist_agencies.csv должен найти соответствующие узлы Agency и Artist, прежде чем создавать отношения между ними. Например:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///artist_agencies.csv" as line
MATCH (ag:Agency) WHERE ag.agency = line.agency
MATCH (ar:Artist) WHERE ar.artist_id = line.artist_id
CREATE (ag)-[:REPRESENTS]->(ar)

В сторону: для файла artist_agencies.csv не требуется столбец artist_name.

[ОБНОВЛЕНИЕ]

Еслиданные artist_agencies.csv могут привести к созданию дублирующих отношений, замените CREATE на (более дорогой) MERGE, чтобы избежать этого. И убедитесь, что у вас нет дубликатов Agency или Artist.

...