py2neo Neo4j类型错误:<map object at 0x03D25C50>不是JSON serializab

2024-03-29 02:21:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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,但是{}是{}方法的结果。我不知道如何解决这个问题。在

有什么明显的我错了吗?在


Tags: idappdatareturndefelementsgraphnodes
2条回答

对于图像中的错误,最简单的回答是您没有从您的except块返回响应。因此,由于try失败,您的视图不会返回任何内容。但这并不能回答真正的问题。我没有在python中使用mapfor循环和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中列表/其他序列类型和迭代器之间的一些区别,next内置函数以及它为什么比{}here更好。在

相关问题 更多 >