Mercurial > hg > NetworkVis
diff 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 diff
--- a/ismi-python-neo4jrestclient/ismi-vis.py Mon Sep 28 18:15:35 2015 +0200 +++ b/ismi-python-neo4jrestclient/ismi-vis.py Thu Oct 01 14:39:56 2015 +0200 @@ -3,7 +3,7 @@ from flask import Flask, Response, request -from neo4jrestclient.client import GraphDatabase, Node +from neo4jrestclient.client import GraphDatabase, Node, Relationship app = Flask(__name__, static_url_path='/static/') gdb = GraphDatabase("http://localhost:7474", username="neo4j", password="neo5j") @@ -16,27 +16,41 @@ @app.route("/graph") def get_graph(): - query = ("MATCH (m:Movie)<-[:ACTED_IN]-(a:Person) " - "RETURN m.title as movie, collect(a.name) as cast " - "LIMIT {limit}") - results = gdb.query(query, - params={"limit": request.args.get("limit", 100)}) + 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 movie, cast in results: - nodes.append({"title": movie, "label": "movie"}) - target = i - i += 1 - for name in cast: - actor = {"title": name, "label": "actor"} - try: - source = nodes.index(actor) - except ValueError: - nodes.append(actor) - source = i - i += 1 - rels.append({"source": source, "target": target}) + 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") @@ -48,32 +62,27 @@ except KeyError: return [] else: - query = ("MATCH (movie:Movie) " - "WHERE movie.title =~ {title} " - "RETURN movie") + query = ("MATCH (text:TEXT) " + "WHERE text.label =~ {title} " + "RETURN text") results = gdb.query( query, returns=Node, params={"title": "(?i).*" + q + ".*"} ) - return Response(dumps([{"movie": row.properties} - for [row] in results]), + return Response(dumps([{"text": row.properties} for [row] in results]), mimetype="application/json") -@app.route("/movie/<title>") -def get_movie(title): - query = ("MATCH (movie:Movie {title:{title}}) " - "OPTIONAL MATCH (movie)<-[r]-(person:Person) " - "RETURN movie.title as title," - "collect([person.name, " - " head(split(lower(type(r)), '_')), r.roles]) as cast " - "LIMIT 1") - results = gdb.query(query, params={"title": title}) - title, cast = results[0] - return Response(dumps({"title": title, - "cast": [dict(zip(("name", "job", "role"), member)) - for member in cast]}), +@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")