2017-03-14 78 views
0
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()方法的結果。我不知道如何解決這個問題。py2neo Neo4j的類型錯誤:<地圖在0x03D25C50對象>不是JSON序列

有沒有什麼明顯的東東在這裏錯了?

+0

我不確定'map'對象是否實現了這個功能,但是許多對象實現了'__str__'方法,以便您可以獲取數據的字符串表示形式。有時它只是類名,但是例如'dict'對象會這樣做:>>> str({'b':2,'c':3}) 「{'c':3,'b ':2}'' –

+0

非常感謝,我已經更改了代碼,但問題顯示如下,我期待着您的回答。萬分感謝! – kenneth

回答

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) 

我已經改變了代碼和我的地圖方法的數據是

{'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

我不不知道如何解決它。我期待着您的回答,謝謝!

0

圖片中錯誤的快速回答是,您沒有返回來自except塊的響應。因此,因爲try失敗,您的視圖不會返回任何內容。但是這並不能回答真正的問題。我沒有在python中使用mapfor循環和list comprehension通常可以很好地完成工作。我也不熟悉neo4j。話雖如此,我相信答案是你正在使用__next__方法。你明白這一點是否有任何理由?根據docs這個迭代迭代迭代得到下一組數據。換句話說,當你遍歷迭代時隱式地調用它 - 例如使用for循環。可能發生的情況是,如果只有一組數據,那麼當您第一次致電__next__時,您將獲得首個且唯一的數據集。但是當你第二次調用它時沒有數據返回,所以你得到map object。這可能不是100%正確的答案,但請嘗試刪除__next__調用,並查看是否有幫助。嘗試簡單地編碼str(edges)str(nodes)而不是調用__next__

0

在Python 2中,內置的map返回了一個列表。在Python 3中,它返回一個迭代器而不是一個列表,json模塊不能序列化。如果你需要一個列表,而不是一個迭代器,你應該使用列表理解:[buildNodes(row) for row in graph.cypher.execute(...)]。您也可以通過執行list(map(...))來強制鍵入,但這不像listcomp那樣清晰。

您應該知道,您不能在列表上調用__next__(或最好是next(...)),但是,因爲這是一個迭代器方法。不過,你可以打印整個列表而不消耗它,所以除非你明確地嘗試延遲加載,否則列表是一個更好的選擇。

你可以閱讀一些列表/其他序列類型和迭代器之間的差異的標準文檔here和有關next內置功能,爲什麼它是最好__next__here

相關問題