将数据从 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