2015-06-28 2 views
1

После игры с игрушечными наборами данных, это была моя первая попытка использовать данные, имеющие отношение к проекту на работе. Короче говоря, после хромоты, чтобы получить почти все мои данные в Neo4j, мой последний запрос просто застопорился. Смотрите скриншот.Neo4j Load CSV Import Stalling

enter image description here

Примечание: Я прототипирования мои запросы, вставив их в инструмент браузера, но мой долгосрочный план, чтобы все команды в .cql файл, который я мог бы сценарий на моем рабочем месте для того, чтобы выполнять ночные анализы.

Чтобы добавить контекст к моей проблеме, я создаю прототипы на своем macbook.

  • 8gb баран
  • 2,2 ГГц процессор Intel i7
  • OSX 10.9.5
  • 2.2.0 сообщество

Я Есмь обработки (строк/столбцов) файлы. Я не импортирую каждый столбец, просто было проще сохранить текущие наборы данных.

  • Ability.csv = 3/1
  • brm.csv = 276992/34
  • cont.sv = 80093/17
  • электронной chain.csv = 199143/34 (это только те данные, Я не могу получить в)
  • электронный первый last.csv = 77849/20
  • recs.csv = 77962/20
  • templates_topics.csv = 29/3
  • templates.csv = 49/4
  • topics.csv = 13/1
  • вендоры = 5/1

Единственные варианты конфигурации, которые я установил вручную Neo4j были в neo4j-wrapper.conf где я поставил wrapper.java.initmemory и wrapper.java.maxmemory к 4096. Я сделал это после того, как тыкался, чтобы найти похожие проблемы.

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

Наконец, поскольку мои данные связаны с работой, я не могу предоставить тестовые данные. Однако я могу ссылаться на мои запросы cypher.

Constraint and LOAD CSV .cql file

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

+0

В вашем последнем заявлении LOAD CSV вы используете свойство 'Email: cid' как свойство, в то время как ваше ограничение находится на' Email: msgid. –

+0

Хорошо поймите, позвольте мне посмотреть, как это происходит. – Btibert3

+0

На этот раз я получил предупреждение о «отключении базы данных» в браузере, когда я попытался выполнить команды, начиная с строки 111 файла cypher.cql. Будет ли работать с файлом из командной строки, чтобы улучшить производительность? – Btibert3

ответ

2

Избегайте постоянной загрузки в LOAD CSV. Он не соблюдает ПЕРИОДИЧЕСКИЙ КОМИТЕТ. См. Это article Марк Нидхем для подробного объяснения.

+0

Я ссылался на эту статью несколько раз. Моя первая проблема (до публикации этого) заключалась в том, что я использовал 'MERGE' безотносительно. Я думал, что я улучшаюсь, используя MATCH + MERGE, но я уверен, что есть еще места для рефакторинга. – Btibert3

+0

Вы пытались «разделить и победить» со сценарием, вы, вероятно, можете определить, какой раздел является оскорбительным, и использовать функциональность EXPLAIN/PROFILE, чтобы лучше понять, что вызывает проблему. Попробуйте (например) создание узла сегментации с помощью отношений, таким образом, вы, вероятно, можете удалить оскорбительный MERGE. – ErnestoE

2

я бы разделить это одно вверх, на создание узлов раз и создание отношений (каждый) второй:

USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM "file:///Users/btibert/Dropbox/Projects/bentley-search-neo4j/data/templates.csv" AS row 
WITH row 
MATCH (r:Vendor {name:row.vendor}) 
WITH row, r 
MERGE (p:Template {name:row.template_clean}) 
MERGE (v:Version {version:row.template_ver}) 
MERGE (p)-[:FROM_VERSION]->(v) 
MERGE (p)-[:CREATED_BY]->(r); 

Как вы можете ясно видеть нетерпеливой операции в плане.

Я имею в виду, что не имеет значения, если у вас всего несколько тысяч строк. Но если он идет на многие сотни тысяч или миллионы, то вытащить все данные занимает больше памяти.

+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 
|  Operator |      Identifiers |                       Other | 
+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 
| EmptyResult |         |                        | 
| UpdateGraph(0) | anon[270], anon[301], p, r, row, v |                     MergePattern | 
| UpdateGraph(1) |   anon[270], p, r, row, v |                     MergePattern | 
| UpdateGraph(2) |      p, r, row, v | MergeNode; row.template_clean; :Template(name); MergeNode; row.template_ver; :Version(version) | 
|   Eager |        r, row |                        | 
| SchemaIndex |        r, row |                  row.vendor; :Vendor(name) | 
|  LoadCSV |        row |                        | 
+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 

я бы, вероятно, изменить это в ON CREATE SET вариант для неключевых свойств: Кроме того, если у вас есть несколько строк на одного студента, которые можно использовать WITH DISTINCT toInt(row.pidm) as pidm, ...., чтобы уменьшить число слияний он должен работать.

LOAD CSV WITH HEADERS FROM "recs.csv" AS row 
WITH row 
MERGE (s:Student {pidm:toInt(row.pidm)}) 
ON CREATE SET s.hash_pidm=toInt(row.hash_pidm), ....; 

Это один я бы разделить на два заявления, по одному для каждого отношения, в противном случае вы можете получить слишком много матчей: (И вы не нужны WITH сек между ними)

LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
WITH row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (v:Vendor {name: row.vendor}) 
MATCH (a:Ability {name: row.ability}) 
WITH row, s, v, a 
MERGE (s)-[:PURCHASED_FROM]->(v) 
MERGE (s)-[:HAS_ABILITY]->(a); 

стал бы:

LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (v:Vendor {name: row.vendor}) 
MERGE (s)-[:PURCHASED_FROM]->(v); 


LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (a:Ability {name: row.ability}) 
MERGE (s)-[:HAS_ABILITY]->(a); 

Здесь я хотел бы также создать контакты на себя. (Опять ON СОЗДАТЬ SET) и сделать отношения студентов в отдельном заявлении:

LOAD CSV WITH HEADERS FROM "....cont.csv" AS row 
MERGE (c:Contact {cid:row.cid}) ON CREATE SET ....; 

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (c:Contact {cid:row.cid}) 
MERGE (s)-[:HAS_CONTACT]->(c); 

Я также хотел бы разделить этот на два заявления:

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
WITH row WHERE toInt(row.seqnum) = 1 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (f:Contact {cid:row.first_cont}) 
MERGE (s)-[:FIRST]->(f); 

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
WITH row WHERE toInt(row.seqnum) = 1 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (l:Contact {cid:row.last_cont}) 
MERGE (s)-[:LAST]->(l); 

Split это один вверх в E- создание почты и потом подключить его к ученику по MSG-ID:

LOAD CSV WITH HEADERS FROM "...brm.csv" AS row 
MERGE (e:Email {msgid:row.msgid}) ON CREATE SET ... ; 

LOAD CSV WITH HEADERS FROM "file:///Users/btibert/Dropbox/Projects/bentley-search-neo4j/data/brm.csv" AS row 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (e:Email {msgid:row.msgid}) 
MERGE (s)-[:WAS_SENT]->(e); 

НТН Майкл

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