2017-05-26 611 views
2

最近,我一直在使用Neo4j作为我正在关注的课程的项目。 我想出了如何使用APOC将我的数据库导出为.csv。如何使用Neo4j APOC导出为.csv,包括关系ID

但是,导出的.csv文件不包含关系ID。 我用下面的调用来导出数据库:

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

我也可以用以下的Cypher查询来获取关系ID的:

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

存在一个apoc.export.csv.query ()但我想不出一个包含apoc.export.csv.all调用中包含的信息并且还包含关系ID的查询。

我可能会单独请求这些ID并使用Python脚本将它们放入export.csv中,但我不确定这些关系的顺序对于单独的调用/查询是否相同。

任何帮助,非常感谢!

+0

“export.csv”的标题是否包含“_start”,“_ end”,“_ type”'?你需要有实际的关系ID? –

+0

嗨Dave,感谢您的快速响应,是的头部包含'_start,_end,_type'。它确实包含节点的'_id',所以我想知道为什么它没有为关系做这件事。是的,我希望有实际的关系ID属于这3个属性:) –

+2

请记住,关系ID不会对你很有用,因为当你导入时,你无法控制Neo4j将分配给哪个内部ID给新创建的节点和关系。节点_id被导出的原因是您将有一个唯一的关键字用于识别节点,以便通过关系将它们连接起来,但是一旦所有内容都被导入并连接起来,那些_id可能不会非常有用。 – InverseFalcon

回答

1

我看不到通过更改配置来实现它的方法。但是如果你真的想要关系ID的输出,你可以克隆apoc repo并对apoc/export/csv/CsvFormat.java进行一些更改。将关系id添加到输出是一种非常快速的方式。

您需要将ID添加到标题。我在追加下面几行, "_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.*系列的整体功能可能会或可能不会有什么进一步的影响。

+0

感谢这个解决方案,它工作得很好:)希望它不会破坏apoc.export。*哈哈 –