from flask import Flask, jsonify, render_template
from py2neo import Graph,authenticate
app = Flask(__name__)
authenticate("localhost:7474","neo4j", "neo4j")
graph = Graph("http://localhost:7474/db/data")
def buildNodes(nodeRecord):
print("............................")
data = {"id": str(nodeRecord.n._id), "label": next(iter(nodeRecord.n.labels))}
data.update(nodeRecord.n.properties)
print(data)
return {"data": data}
def buildEdges(relationRecord):
data = {"source": str(relationRecord.r.start_node._id),
"target": str(relationRecord.r.end_node._id),
"relationship": relationRecord.r.rel.type}
return {"data": data}
@app.route('/')
def index():
print("index")
return render_template('index.html')
@app.route('/graph')
def get_graph():
# print(graph.cypher.execute('MATCH (n) RETURN n').columns)
nodes = map(buildNodes, graph.cypher.execute('MATCH (n) RETURN n'))
print(nodes)
edges = map(buildEdges, graph.cypher.execute('MATCH ()-[r]->() RETURN r'))
print(edges)
# json_2={"nodes":nodes,"edges":edges}
# return json.dumps(json_2, cls=UserEncoder)
elements = {"nodes": nodes, "edges": edges}
print(dict(elements))
return jsonify(elements)
return jsonify(elements)
if __name__ == '__main__':
app.run(debug = False)
当我使用Python连接图形数据库(neo4j)时,我遇到了问题
'map object at 0x03D25C50' is not JSON serializable
,但是{
有什么明显的我错了吗?在
对于图像中的错误,最简单的回答是您没有从您的
except
块返回响应。因此,由于try
失败,您的视图不会返回任何内容。但这并不能回答真正的问题。我没有在python中使用map
。for
循环和list comprehension通常可以很好地完成任务。我对neo4j
一点也不熟悉。话虽如此,我相信答案是您使用的是__next__
方法。你为什么要这么做?根据docs在迭代iterable以获得下一组数据时使用的docs。换句话说,当您使用for
循环遍历iterable时,它是隐式调用的。可能发生的情况是,如果只有一组数据,那么当您第一次调用__next__
时,您将得到第一个也是唯一的一个数据集。但是当您第二次调用它时,它没有要返回的数据,所以您得到一个map object
。这可能不是100%正确的答案,但请尝试删除__next__
调用,看看这是否有帮助。尝试简单地编码str(edges)
和str(nodes)
,而不是调用__next__
。在在Python2中,
map
内置返回了一个列表。在Python3中,它返回一个迭代器而不是列表,json
模块无法序列化该列表。如果需要列表,而不是迭代器,则应使用列表理解:[buildNodes(row) for row in graph.cypher.execute(...)]
。您也可以通过执行list(map(...))
来强制键入它,但这并不像listcomp那样清楚。在您应该知道,您不能在列表中调用
__next__
(或者,最好是next(...)
),因为这是一个迭代器方法。但是,您可以打印一个完整的列表而不使用它,所以除非您显式地尝试延迟加载,否则无论如何,列表在这里是一个更好的选择。在您可以阅读标准文档here中列表/其他序列类型和迭代器之间的一些区别,}here更好。在
next
内置函数以及它为什么比{相关问题 更多 >
编程相关推荐