я бы разделить это одно вверх, на создание узлов раз и создание отношений (каждый) второй:
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);
НТН Майкл
В вашем последнем заявлении LOAD CSV вы используете свойство 'Email: cid' как свойство, в то время как ваше ограничение находится на' Email: msgid. –
Хорошо поймите, позвольте мне посмотреть, как это происходит. – Btibert3
На этот раз я получил предупреждение о «отключении базы данных» в браузере, когда я попытался выполнить команды, начиная с строки 111 файла cypher.cql. Будет ли работать с файлом из командной строки, чтобы улучшить производительность? – Btibert3