Я пытаюсь загрузить шаблоны данных в neo4j из cvs-файлов с использованием командных строк cypher. У меня есть два файла данных, один из которых содержит объекты, а другой - объекты.Проблемы с загрузкой шаблонов данных из CSV
файл объекта:
ID
ABC-DE
DEF
Часть файла:
ID ParentID Level Size
ABC ABC-DE 1 3
DE ABC-DE 1 2
AB ABC 2 2
BC ABC 2 2
DE DEF 1 2
F DEF 2 1
A AB 3 1
B AB 3 1
B BC 3 1
C BC 3 1
D DE 3 1
E DE 3 1
Cypher командные строки, используемые для загрузки данных:
LOAD CSV WITH HEADERS FROM 'file:///path_to_file/object.csv' as csvLine FIELDTERMINATOR '\t' CREATE (:Object { Name: csvLine.ID}) RETURN count(*);
LOAD CSV WITH HEADERS FROM 'file:///path_to_file/part.csv' as csvLine FIELDTERMINATOR '\t' MATCH (o:Object {Name: csvLine.ParentID}) MERGE (p:Part {Name: csvLine.ID}) ON CREATE SET p.Size = csvLine.Size CREATE (o) -[:hasPart {Level: csvLine.Level}]-> (p) RETURN count(*);
LOAD CSV WITH HEADERS FROM 'file:///path_to_file/part.csv' as csvLine FIELDTERMINATOR '\t' MATCH (o:Part {Name: csvLine.ParentID}) MERGE (p:Part {Name: csvLine.ID}) ON CREATE SET p.Size = csvLine.Size CREATE (o) -[:hasPart {Level: csvLine.Level}]-> (p) return count(*);
Первые две командные строки выполнять должным образом, создавая 2 и 3 узла соответственно и соответствующие ссылки. Третья командная строка создает только 4 узла: AB, BC, D и E. По-видимому, создаются и связаны только узлы, связанные с существующими узлами.
Из содержимого файла CSV мы можем видеть, что родительские узлы перечислены перед дочерними узлами, поэтому мы могли ожидать, что узлы A, B и C могли быть созданы и соответственно связаны с AB и BC.
Является ли текущее поведение CSV загрузки ожидаемого, что предотвращает загрузку таких шаблонов или есть проблема в моем коде или ошибке?
Эта проблема существует как с neo4j 2.1.7, так и с neo4j 2.2.0-M04.
Действительно, это было мое чувство, спасибо за вашу помощь. COMMIT 1, вероятно, будет проблемой для загрузки большого объема, я все равно попробую. Я изменился на двухпроходный импорт. Вы говорите, что мне не нужен объектный файл, разве вы не думаете, что сопоставление 728 000 идентификаторов узлов для импорта только 100 000 узлов будет не слишком медленным? – Pierre
Я на самом деле не эксперт в SQL-базах данных, но я думал, что транзакции сохранят содержимое базы данных до тех пор, пока не будет выполнен COMMIT, не мешая механизму работы INSERT. Таким образом, не следует ожидать загрузки, как описано выше, для работы независимо от частоты COMMIT? – Pierre
Пьер, это разумный вопрос. Я думаю, что мне понадобится neo4j dev для взвешивания, но я понимаю, что узел, который является 'CREATE'd в транзакции, недоступен/технически не существует до тех пор, пока эта транзакция не будет выполнена. Я интерпретирую это как часть «атомарности» гарантии транзакций (http://neo4j.com/docs/stable/transactions.html) - поэтому, я думаю (и снова это нужно дважды проверить), что если вы СОЗДАТЬ узел в транзакции, он еще не существует внутри этой транзакции. Он существует только при совершении транзакции. – FrobberOfBits