Создание узлов и отношений из CSV данных, взятых из реляционной базы данных - PullRequest
0 голосов
/ 14 июня 2019

Я новичок в Cypher и пытаюсь создать узлы и связи из данных, взятых из базы данных SQL. Я уже экспортировал данные как CSV.

Вот фиктивное представление данных о том, как выглядят мои данные (у набора данных, над которым я работаю, ~ 84 тыс. Строк):

membership_id member_id  hotel hotel_location   visit_dt
            1       A11 Hotel1          Texas 2019-01-01
            1       A12 Hotel2          Texas 2019-02-04
            1       A13 Hotel1          Texas 2019-01-01
            2       B11 Hotel3     California 2019-01-25
            2       B12 Hotel2     California 2019-02-04
            2       B13 Hotel3     California 2019-01-25
            2       B12 Hotel1     California 2019-01-01

Строка CSV для вышеупомянутых данных приведена ниже:

"membership_id,member_id,hotel,hotel_location,visit_dt\n1,A11,Hotel1,Texas,2019-01-01\n1,A12,Hotel2,NewYork,2019-02-04\n1,A13,Hotel1,Texas,2019-01-01\n2,B11,Hotel3,California,2019-01-25\n2,B12,Hotel2,NewYork,2019-02-04\n2,B13,Hotel3,California,2019-01-25\n2,B12,Hotel1,Texas,2019-01-01"

Предположим, что вышеупомянутые данные были загружены как dataset.

Объекты, которые я хочу создать:

  1. :Membership{membership_id:dataset.membership_id}
  2. :Member{member_id:dataset.member_id}
  3. :Hotel{hotel_name:dataset.hotel}
  4. :State{state_name:dataset.hotel_location}

Отношения, которые я хочу создать между вышеупомянутыми объектами:

  1. (:Membership)-[:ASSOCIATE]-(:Member)
  2. (:Member)-[:VISIT{visit_date:dataset.visit_dt}]->(:Hotel)
  3. (:Hotel)-[:LOCATED_AT{location:dataset.hotel_location}]->(:State)

Ниже приведено изображение того, как должен выглядеть мой график: example_graph

Чтобы добиться этого, я попробовал следующий запрос:

LOAD CSV WITH HEADERS FROM "file:///test.csv" AS dataset 
MERGE (ms:Membership{family_id:dataset.patient_family_id}) 
WITH dataset, ms 
MERGE (m::Member{member_id:dataset.member_id})
WITH dataset, ms, m
MERGE (h:Hotel{hotel_name:dataset.hotel})
WITH ms, m, h, dataset
MERGE (s:State{state_name:dataset.hotel_location})
WITH ms, m, h, s, dataset
MERGE (ms)-[:ASSOCIATE]-(m)
WITH ms, m, h, s, dataset
MERGE (m)-[:VISIT{visit_date:dataset.visit_dt}]->(h)
WITH ms, m, h, s, dataset
MERGE (h)-[:LOCATED_AT{location:dataset.hotel_location}]->(s)
RETURN ms, m, h, s

Но при выполнении вышеупомянутого запроса к набору данных (~ 84 тыс. Строк), он остается в работе в течение очень долгого времени, и мне никогда не удавалось достичь состояния, когда я могу увидеть некоторые результаты.

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

Заранее спасибо.

1 Ответ

1 голос
/ 14 июня 2019

Вы хотите убедиться, что у вас есть индексы и / или уникальные ограничения на комбинации меток / свойств, которые вы будете использовать для поиска и идентификации ваших узлов, что ускорит ваше сопоставление и объединение узлов.

Вы захотите использовать ИСПОЛЬЗОВАНИЕ ПЕРИОДИЧЕСКОГО КОМИТЕТА при загрузке, если CSV велик, это позаботится о дозировании.

Возможно, вы также захотите отделить создание узлов от создания отношений, поэтому попробуйте использовать запрос только для создания / объединения узлов, сделайте с ним пропуск через CSV, а затем используйте отдельный запрос на загрузку, чтобы сопоставить его с уже созданными узлами. и создать отношения между ними.

И не возвращайте данные в конце, в этом нет необходимости, и браузер плохо справляется с возвратом тонны строк данных, если это то, что вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...