将数据从 neo4j 导出到 csv 而不是 json

Posted

技术标签:

【中文标题】将数据从 neo4j 导出到 csv 而不是 json【英文标题】:Exporting data from neo4j to csv instead of json 【发布时间】:2015-01-05 03:23:36 【问题描述】:

我正在使用neo4jdb-python 包来查询 Neo4j 数据库。例如,考虑下面的代码

import neo4j
connection = neo4j.connect("http://localhost:7474")
cursor = connection.cursor()
for i in cursor.execute("MATCH a RETURN a LIMIT 1"):
    print i 

但是输出是元组的形式。即

(u'text': u'Stoyanov, S., Hoogveld, B., Kirschner, P.A., (2010). Mapping Major Changes to Education and Training in 2025, in JRC Technical Note JRC59079., Publications Office of the European Union: Luxembourg.', u'identifier': u'reference/lak/226',)

如何获得 csv 格式的输出。这可以通过 neo4j 的 Web 视图实现。输出是这样的,

"""text"":""Stoyanov, S., Hoogveld, B., Kirschner, P.A., (2010). Mapping Major Changes to Education and Training in 2025, in JRC Technical Note JRC59079., Publications Office of the European Union: Luxembourg."",""identifier"":""reference/lak/226"""

但是我想通过客户端程序来完成,因为我需要将它嵌入到另一个程序中。如果neo4jdb-python 无法实现,那么还有哪些其他可用选项。

【问题讨论】:

您希望键作为标题,值作为列是吗? @Padraic 更具体地说,我希望输出为 """text"":""Stoyanov, S., Hoogveld, B., Kirschner, PA, (2010)。映射主要变化to Education and Training in 2025, in JRC Technical Note JRC59079., Publications Office of the European Union: Luxembourg."",""identifier"":""reference/lak/226""" 所以你想要json? csv 在哪里发挥作用? @NicoleWhite 当您从 Neo4j Web 视图导出为“CSV”时,您会得到它作为输出。 JSON O/P 很奇怪(这个特定查询有超过 1000 个字符,是 CSV 大小的 10 倍。) 当我从浏览器导出 csv 时,我得到的是 csv,而不是 json。你按的是哪个按钮?可以提供截图吗? 【参考方案1】:

正如 Mark Needham 在his answer 中提到的那样,Neo4j 服务器只返回 JSON。

因此,任何将其转换为 CSV 的代码都必须在客户端。这可以使用csv 模块来完成。请注意,neo4jdb-python 包仅与 Python2.7 兼容。

获取数据的最少代码是

import neo4j
connection = neo4j.connect("http://localhost:7474")
cursor = connection.cursor()
data = list(cursor.execute("MATCH a RETURN a LIMIT 1")

请注意,如问题中所述,返回值采用元组的形式。创建 csv 文件的最少代码是

with open("test.csv","w") as csvfile:
    writer = csv.writer(csvfile,delimiter = ',',quotechar = '"',quoting = csv.QUOTE_ALL)
    writer.writerow(t[0].keys())
    for i in t:
        writer.writerow(['"%s":"%s"'%(k,v) for k,v in i.iteritems()])

代码的解释很简单,打开一个文件。使用csv.writer,创建一个writer 对象。首先使用writerow 写入标题。最后循环遍历字典并写入行。

得到的输出是

"""text"":""Stoyanov, S., Hoogveld, B., Kirschner, P.A., (2010). Mapping Major Changes to Education and Training in 2025, in JRC Technical Note JRC59079., Publications Office of the European Union: Luxembourg.""","""identifier"":""reference/lak/226"""

这与使用exportable.coffee 脚本获得的相似。

【讨论】:

【参考方案2】:

该 CSV 实际上并非来自特定 API - 它在客户端被转换为 CSV 格式。

相应的代码在exportable.coffee如果你想看看:

    $scope.exportCSV = (data) ->
      return unless data
      csv = new CSV.Serializer()
      csv.columns(data.columns())
      for row in data.rows()
        csv.append(row)

那指的是CSV.coffee。我想你应该能够在 Python 中做类似的事情,也许是 using json.dumps 像这样:

> import json
> t = (u'text': u'Stoyanov, S., Hoogveld, B., Kirschner, P.A., (2010). Mapping Major Changes to Education and Training in 2025, in JRC Technical Note JRC59079., Publications Office of the European Union: Luxembourg.', u'identifier': u'reference/lak/226',)
> json.dumps(t)
 '["text": "Stoyanov, S., Hoogveld, B., Kirschner, P.A., (2010). Mapping Major Changes to Education and Training in 2025, in JRC Technical Note JRC59079., Publications Office of the European Union: Luxembourg.", "identifier": "reference/lak/226"]'

【讨论】:

谢谢,但是有没有一种直接的方法可以用 Java 或任何其他语言导出为 CSV 格式? 不,我不这么认为。 Neo4j 服务器只返回 JSON AFAIK。不过,将其转换为 CSV 应该不会太难? 只需使用 opencsv 并通过要导出到 json 的节点属性返回从数据库中获取的内容。请参阅此处获取一些代码:github.com/jexp/neo4j-shell-tools/blob/master/src/main/java/org/…

以上是关于将数据从 neo4j 导出到 csv 而不是 json的主要内容,如果未能解决你的问题,请参考以下文章

ArangoDB - 如何将neo4j数据库导出导入ArangoDB

使用JS将文件加载到neo4j

从 MySQL 导出到 Neo4j

使用适当的变量类型将 CSV 文件从 redshift 导出到本地

怎么将oracle的数据导入到neo4j

xml Scriptella配置文件,用于将数据直接从Neo4j导出到MySQL数据库