view d3s_examples/python-neo4jrestclient/sphaera.py @ 26:22be4ea663a7

Trying to work out having json request from neo4j display properly in drop down selectize box
author arussell
date Tue, 01 Dec 2015 02:07:13 -0500
parents 18ef6948d689
children
line wrap: on
line source

#!/usr/bin/env python
from json import dumps

from flask import Flask, Response, request, send_from_directory

from neo4jrestclient.client import GraphDatabase, Node, Relationship

app = Flask(__name__, static_url_path='/static/')
#gdb = GraphDatabase("http://localhost:7474")
gdb = GraphDatabase("http://euler.mpiwg-berlin.mpg.de:7474")


@app.route('/json/<path:path>')
def send_json(path):
    return send_from_directory('static/json', path)

@app.route('/platin/<path:path>')
def send_platin(path):
    return send_from_directory('static/platin', path)



@app.route("/")
def get_index():
    return app.send_static_file('index.html')

@app.route("/sphaera")
def get_sphaera():
    return app.send_static_file('index_sphaera.html')


@app.route("/graph")
def get_graph():
   
    query = ("MATCH (m:Edition)<-[r]-(e:Edition) "
             "RETURN m,r,e "
             "LIMIT {limit}")
    results = gdb.query(query,
                        params={"limit": request.args.get("limit", 10000)},returns=(Node,Relationship,Node))
    nodes = []
    rels = []
    nodesIdSet=set()
    i = 0
    for ed1,r,ed2   in results:
        ed1id = ed1.properties["Nid"]
      
        #lon = ed1.properties.get("lon","")
        #lat = ed1.properties.get("lat","")
        node = ed1.properties.copy()
        node["title"]=ed1id
        if ed1id not in nodesIdSet:    
            nodes.append(node)
            nodesIdSet.add(ed1id)
            
        target = nodes.index(node)
          
        
        #lon = ed2.properties.get("lon","")
        #lat = ed2.properties.get("lat","")
        ed2id = ed2.properties["Nid"]
        node = ed2.properties.copy()
        node["title"]=ed2id
          
        if ed2id not in nodesIdSet:
            nodes.append(node)
            nodesIdSet.add(ed2id)
            
        source =nodes.index(node)
        
        rels.append({"source": source, "target": target})
        
    return Response(dumps({"nodes": nodes, "links": rels}),
                    mimetype="application/json")


@app.route("/search")
def get_search():
    try:
        q = request.args["q"]
    except KeyError:
        return []
    else:
        query = ("MATCH (ed:Edition) "
                 "WHERE ed.name =~ {title} "
                 "RETURN ed")
        results = gdb.query(
            query,
            returns=Node,
            params={"title": "(?i).*" + q + ".*"}
        )
       
        return Response(dumps([{"edition": row.properties}
                               for [row] in results]),
                        mimetype="application/json")


@app.route("/edition/<nid>")
def get_movie(nid):
    query = ("MATCH (ed:Edition {Nid:{Nid}}) "
             "RETURN ed.Nid as Nid,"
             "ed.Title as Title "
             "LIMIT 1")
    results = gdb.query(query, params={"Nid": nid})
    nid, title = results[0]
    return Response(dumps({"title": nid,
                           "name":  title}),
                    mimetype="application/json")


if __name__ == '__main__':
    app.debug = True
    app.run(port=8080)