py2neo Neo4j TypeError:<map object =“”at =“”0x03d25c50 =“”>不是JSON可序列化的

时间:2017-03-14 13:52:16

标签: python neo4j py2neo

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 0x03D25C50map()方法的结果。我不知道如何解决这个问题。

这里有什么明显的错误吗?

3 个答案:

答案 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中使用mapfor循环和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(...)),因为这是迭代器方法。但是,您可以在不使用它的情况下打印整个列表,因此除非您明确尝试延迟加载,否则无论如何列表都是更好的选择。

您可以在标准文档herenext内置函数中了解列表/其他序列类型和迭代器之间的一些区别,以及为什么它优于{{1} } here