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
,但map object at 0x03D25C50
是map()
方法的结果。我不知道如何解决这个问题。
这里有什么明显的错误吗?
答案 0 :(得分:0)
@app.route('/graph')
def get_graph():
print(graph.cypher.execute('MATCH (n) RETURN n'))
nodes = map(buildNodes, graph.cypher.execute('MATCH (n) RETURN n'))
print(nodes.__next__())
edges = map(buildEdges, graph.cypher.execute('MATCH ()-[r]->() RETURN r'))
print(edges.__next__())
# json_2={"nodes":nodes,"edges":edges}
# return json.dumps(json_2, cls=UserEncoder)
try:
elements = {"nodes": nodes.__next__(), "edges": edges.__next__()}
print(elements)
return jsonify(elements)
except StopIteration:
print("here is end")
if __name__ == '__main__':
app.run(debug = False)
我更改了代码,我的map方法的数据是
{'data': {'id': '526', 'tagline': 'Welcome to the Real World', 'released': 1999, 'title': 'The Matrix', 'label': 'Movie'}}
和
{'data': {'relationship': 'ACTED_IN', 'source': '527', 'target': '526'}}
但它也有问题 enter image description here
我不知道如何解决它。我期待你的回答,谢谢!
答案 1 :(得分:0)
快速回答图片中的错误是说您没有从except
块中返回回复。因此try
失败了,你的观点没有返回任何东西。但这并没有回答真正的问题。我没有在python中使用map
。 for
循环和list comprehension通常可以很好地完成工作。我对neo4j
一点也不熟悉。话虽如此,我相信答案是你正在使用__next__
方法。你明确地这样做有什么理由吗?根据迭代迭代以获取下一组数据时使用的docs。换句话说,当你循环遍历一个可迭代的时候会隐式调用它 - 例如使用for
循环。可能发生的情况是,如果只有一组数据,当您第一次调用__next__
时,您将获得第一个且仅获得数据集。但是当你第二次调用它时没有数据要返回,所以你得到map object
。这可能不是100%正确答案,但请尝试删除__next__
来电,看看是否有帮助。尝试简单地对str(edges)
和str(nodes)
进行编码,而不是调用__next__
。
答案 2 :(得分:0)
在Python 2中,map
内置返回了一个列表。在Python 3中,它返回一个迭代器而不是一个列表,json
模块不能序列化。如果需要列表而不是迭代器,则应使用列表推导:[buildNodes(row) for row in graph.cypher.execute(...)]
。你也可以通过list(map(...))
强制输入它,但这不像listcomp那样清晰。
您应该知道,您无法在列表中调用__next__
(或者,最好是next(...)
),因为这是迭代器方法。但是,您可以在不使用它的情况下打印整个列表,因此除非您明确尝试延迟加载,否则无论如何列表都是更好的选择。
您可以在标准文档here和next
内置函数中了解列表/其他序列类型和迭代器之间的一些区别,以及为什么它优于{{1} } here。