【问题标题】:Exporting data from neo4j to csv instead of json将数据从 neo4j 导出到 csv 而不是 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。你按的是哪个按钮?可以提供截图吗?

标签: python list csv neo4j cypher


【解决方案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/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多