Как экспортировать в .csv с помощью Neo4j APOC, включая идентификатор отношения

Недавно я использовал Neo4j для проекта курса, за которым следую. Я понял, как использовать APOC для экспорта моей базы данных в .csv.

Однако экспортированный CSV-файл не содержит идентификатор отношения. Я использую следующий вызов для экспорта базы данных:

CALL apoc.export.csv.all("export.csv",{})

Я также могу использовать следующий запрос Cypher для получения идентификаторов отношений:

MATCH ()-[r]-() RETURN ID(r)

Существует apoc.export.csv.query(), но я не могу придумать запрос, содержащий информацию, содержащуюся в вызове apoc.export.csv.all а также содержит идентификатор отношения.

Я потенциально мог бы запросить идентификаторы отдельно и поместить их в export.csv с помощью скрипта Python, но я не уверен, будет ли порядок отношений одинаковым для отдельных вызовов/запросов.

Любая помощь приветствуется!


person Koen Verhaegh    schedule 26.05.2017    source источник
comment
содержит ли заголовок export.csv "_start","_end","_type"? Вам нужен фактический идентификатор отношений?   -  person Dave Bennett    schedule 26.05.2017
comment
Привет, Дэйв, спасибо за быстрый ответ, да, заголовок содержит _start, _end, _type. Он содержит _id для узлов, поэтому мне было интересно, почему он не делает этого для отношений. И да, я хотел бы иметь фактический идентификатор отношения, принадлежащий этим трем атрибутам :)   -  person Koen Verhaegh    schedule 26.05.2017
comment
Имейте в виду, что идентификатор отношения не будет очень полезен для вас, так как при импорте вы не можете контролировать, какие внутренние идентификаторы Neo4j назначит вновь созданным узлам и отношениям. Причина, по которой _id узлов экспортируются, заключается в том, что у вас будет уникальный ключ, который можно использовать для идентификации узлов для их резервного соединения через отношения, но как только все будет импортировано и подключено, эти _id, вероятно, не будут очень полезными. .   -  person InverseFalcon    schedule 26.05.2017


Ответы (1)


Я не видел способа сделать это, изменив конфигурацию. Но если вам действительно нужен вывод с идентификатором отношения, вы можете клонировать репозиторий apoc и внести несколько изменений в apoc/export/csv/CsvFormat.java. Это довольно быстрый способ добавить идентификатор отношения к выходным данным.

Вам нужно добавить идентификатор в заголовок. Я добавил , "_id:id" в строки ниже...

List<String> relHeader = generateHeader(relPropTypes, config.useTypes(), "_start:id", "_end:id", "_type:label", "_id:id");

List<String> header = generateHeader(relPropTypes, config.useTypes(), "_start:id", "_end:id", "_type:label", "_id:id");

И вам нужно изменить несколько строк в writeRels(SubGraph graph, CSVWriter out, Reporter reporter, Map<String, Class> relPropTypes, int cols, int offset)

Я добавил...

row[offset+3]=String.valueOf(rel.getId());

И изменил смещение с 3 на 4 в следующей строке

collectProps(relPropTypes.keySet(), rel, reporter, row, 4 + offset);

Это дало результат, который выглядит так...

"_id","_labels","name","_start","_end","_type","_id","a_lot"
"0",":Node","A",,,,,
"1",":Node","B",,,,,
"2",":Node","C",,,,,
,,,"0","1","REL","0",""
,,,"0","2","LIKES","1","true"

Я использовал сообщество 3.2 для теста. Я понятия не имею, какие дальнейшие изменения могут иметь или не иметь последствия для общей функции коллекции apoc.export.*.

person Dave Bennett    schedule 26.05.2017
comment
Спасибо за это решение, оно отлично работает :) Надеюсь, оно не сломает apoc.export.* ха-ха - person Koen Verhaegh; 26.05.2017