2016-11-28 3 views
0

Я новичок в Neo4j:настройки отношения с таблицей для ссылок

Я переезжаю данных MySQL, чтобы визуализировать и anaylise данные, но я не могу установить отношения.

Пока мой сценарий сборки выглядит следующим образом:

// Create Players 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:player.csv" AS row 
CREATE (:Player { playerID: row.id, name: row.Name }); 
CREATE INDEX ON :Player(name); 
CREATE INDEX ON :Player(playerID); 

// Create Team 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:team.csv" AS row 
CREATE (:Team { teamID: row.id }); 
CREATE INDEX ON :Team(teamID); 

// Create PlayerLinks 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:playerlinks.csv" AS row 
CREATE (:Links { linkID: row.id, fromPlayerID: row.fromPlayerID, toPlayerId: row.toPlayerId, teamID: row.teamID, years: row.years }); 


MATCH (p:Player),(t:Team), (l:Links) 
WHERE l.fromPlayerID = p.playerID 
AND  l.toPlayerId = p.playerID 
AND  l.teamID = t.teamID 
CREATE 

В таблице playerlinks содержит отношения, которые я хотел создать

Вот диаграмма того, что я стремлюсь достичь: Players

+1

Для этого вам не нужно создавать индекс для каждого добавляемого вами узла. После создания индекса схемы он будет применяться к любому узлу, добавленному с этим ярлыком. Поэтому, если ваши индексы уже на месте, вы можете полностью удалить их из своего скрипта. Хотя я бы рекомендовал использовать уникальное ограничение вместо индекса, когда дело доходит до ваших идентификационных полей. Кроме того, вы не указали, что не так с вашим скриптом. Можете ли вы вставлять ошибки, которые вы пытаетесь запустить, или лучше описывать проблемы, с которыми вы сталкиваетесь? – InverseFalcon

+1

Может быть, добавить репрезентативную схему того, как должна выглядеть результирующая структура? –

+0

Не могли бы вы также немного рассказать о своих: Ссылки? Я могу понять, как связывать игрока с командой, но вы также указываете в той же строке ссылку от одного игрока к другому, не говоря уже о характере этих отношений. Что это за игровая ссылка для игрока? – InverseFalcon

ответ

1

Похоже, вы почти на самом деле.

Как уже упоминалось в моих комментариях по самому вопросу, вы захотите отказаться от создания индекса из своих сценариев (они должны применяться только один раз до вашего импорта, и вам следует рассмотреть возможность использования уникальных ограничений для полей ID).

Что касается ваших: узлов ссылок, вы планируете использовать их только для создания отношений, или вы планируете сохранить их после этого?

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

MATCH (l:Links) 
WITH l 
MATCH (p1:Player), (p2:Player), (t:Team) 
WHERE l.fromPlayerID = p1.playerID 
AND  l.toPlayerId = p2.playerID 
AND  l.teamID = t.teamID 
MERGE (l)-[:Teammate]->(p1) 
MERGE (l)-[:Teammate]->(p2) 
MERGE (l)-[:PlayedOn]->(t) 

, который соединяет: Ссылки узел для игроков, которые являются товарищами по команде, с: командой, в которую они играли, и ваш: узел Links удерживает годы, в которые они играли вместе. В этот момент вы можете удалить свойства linkID, toPlayerID, fromPlayerID и teamID из узла, так как в отношениях db графика отношения заменяют внешние ключи при переводе из реляционного db, и поскольку вы, вероятно, не будете искать: Ссылки узлы по идентификатору.

В качестве альтернативы (и в соответствии с вашей желаемой диаграммой) вы можете использовать информацию на узлах: Ссылки для создания связей между: Игроками напрямую. Вы можете установить атрибуты в отношениях для количества лет, проведенных вместе, и идентификатора (или имени) команды, в которую они играли. Имейте в виду, что сама связь не сможет указать на: узел Team, в котором игроки играли вместе, хотя вы должны иметь возможность использовать эту информацию для создания: PlayedOn отношений от: Players to: Team в вопросе.

Такое моделирование может выглядеть следующим образом:

MATCH (l:Links) 
WITH l 
MATCH (p1:Player), (p2:Player), (t:Team) 
WHERE l.fromPlayerID = p1.playerID 
AND  l.toPlayerId = p2.playerID 
AND  l.teamID = t.teamID 
MERGE (p1)-[:Teammate{years: l.years, team: t.teamID}]->(p2) 
MERGE (p1)-[:PlayedOn]->(t) 
MERGE (p2)-[:PlayedOn]->(t) 

Имейте в виду сращивание: Teammate отношений может быть медленным. Если вы планируете запускать это только один раз, вы можете использовать CREATE вместо MERGE.

+0

спасибо за помощь. Я запустил второй запрос, поскольку он похоже, к чему я стремлюсь. Однако, когда я запускаю его, ошибок нет, но отношения не создаются (так как я не вижу их в браузере) –

+0

Вы не увидите их в результате запроса создания, но вы должен видеть обратную связь, что отношения создаются. Чтобы запросить игроков, которые являются товарищами по команде, попробуйте этот запрос: «MATCH (p1: Player) - [r: Teammate] -> (p2: Player) RETURN p1, r, p2' – InverseFalcon

+0

нет обратной связи как таковой, и этот запрос не возвращает результатов , Я вижу, что все узлы созданы. Однако создание отношения заканчивается в 163ms и типы отношений остается пустым –

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