view ismi-python-neo4jrestclient/ismi-vis.py @ 7:45dad9e38c82

first functional version of commentary visualisation.
author casties
date Thu, 01 Oct 2015 14:39:56 +0200
parents aeef1fedd899
children 0f4846255b20
line wrap: on
line source

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

from flask import Flask, Response, request

from neo4jrestclient.client import GraphDatabase, Node, Relationship

app = Flask(__name__, static_url_path='/static/')
gdb = GraphDatabase("http://localhost:7474", username="neo4j", password="neo5j")


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


@app.route("/graph")
def get_graph():
    query = ("match (t1:TEXT)-[r:is_commentary_on]->(t2:TEXT) return t1,r,t2")
    results = gdb.query(query, returns=(Node,Relationship,Node))
    n4j_nodes = {}
    node_idx = {}
    nodes = []
    rels = []
    i = 0
    for node1, rel, node2 in results:
        # source node
        id1 = node1['ismi_id']
        if id1 not in n4j_nodes:
            n4j_nodes[id1] = node1
            nodes.append({"title": node1['label'], "label": "TEXT"})
            node_idx[id1] = i
            source = i
            i += 1

        else:
            source = node_idx[id1]

        # target node
        id2 = node2['ismi_id']
        if id2 not in n4j_nodes:
            n4j_nodes[id2] = node2
            nodes.append({"title": node2['label'], "label": "TEXT"})
            node_idx[id2] = i
            target = i
            i += 1

        else:
            target = node_idx[id2]

        # relation
        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 (text:TEXT) "
                 "WHERE text.label =~ {title} "
                 "RETURN text")
        results = gdb.query(
            query,
            returns=Node,
            params={"title": "(?i).*" + q + ".*"}
        )
        return Response(dumps([{"text": row.properties} for [row] in results]),
                        mimetype="application/json")


@app.route("/text/<text_id>")
def get_text(text_id):
    query = ("MATCH (text:TEXT {ismi_id:{text_id}}) "
             " RETURN text"
             " LIMIT 1")
    results = gdb.query(query, returns=Node, params={"text_id": int(text_id)})
    node = results[0][0]
    print("node:%s"%repr(node))
    return Response(dumps({"title": node['label'], "attrs": node.properties}),
                    mimetype="application/json")


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